Android实现单页面浮层可拖动view的一种方法
程序员文章站
2023-12-17 13:39:34
上一篇讲到通过通过goolge官方的viewdraghelper工具实现拖动的方法(上一篇见),那么有一个问题就是在dragframelayout中的ontoucheven...
上一篇讲到通过通过goolge官方的viewdraghelper工具实现拖动的方法(上一篇见),那么有一个问题就是在dragframelayout中的ontouchevent一直接收不到触摸消息,而且在onintercepttouchevent的时候,并没有触发viewdraghelper.trycaptureview方法,因此诞生了另一种比较原始的方法:通过自定义可拖动view来实现
主要方法:
initedge:设置可拖动view能拖动范围的初始边界,一般情况下为父布局的边界。注意view.getleft...等会获取到会0,我是在网路数据返回的情况下设置边界,并显示的。也有方法开一个子线程获取。
ontouchevent:拖动的计算以及重新layout
代码:
import android.content.context; import android.support.annotation.nullable; import android.support.v7.widget.appcompatimageview; import android.util.attributeset; import android.view.motionevent; /** * created by hq on 2017/10/10. * 参考:http://blog.csdn.net/zane_xiao/article/details/51188867 */ public class dragimageview extends appcompatimageview { string tag = "dragimageview"; public dragimageview(context context) { this(context, null); } public dragimageview(context context, @nullable attributeset attrs) { this(context, attrs, 0); } public dragimageview(context context, @nullable attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); } /** * 设置在父布局中的边界 * @param l * @param t * @param r * @param b */ public void initedge(int l,int t,int r,int b) { edgeleft = l; edgetop = t; edgeright = r; edgebottom = b; } int edgeleft, edgetop, edgeright, edgebottom; int lastx, lasty, movex, movey, dx, dy; @override public boolean ontouchevent(motionevent event) { switch (event.getaction()) { case motionevent.action_down: lastx = (int) event.getrawx(); lasty = (int) event.getrawy(); movex = lastx; movey = lasty; break; case motionevent.action_move: dx = (int) event.getrawx() - lastx; dy = (int) event.getrawy() - lasty; int left = getleft() + dx; int top = gettop() + dy; int right = getright() + dx; int bottom = getbottom() + dy; if (left < edgeleft) { left = edgeleft; right = left + getwidth(); } if (right > edgeright) { right = edgeright; left = right - getwidth(); } if (top < edgetop) { top = edgetop; bottom = top + getheight(); } if (bottom > edgebottom) { bottom = edgebottom; top = bottom - getheight(); } layout(left, top, right, bottom); lastx = (int) event.getrawx(); lasty = (int) event.getrawy(); break; case motionevent.action_up: //避免滑出触发点击事件 if ((int) (event.getrawx() - movex) != 0 || (int) (event.getrawy() - movey) != 0) { return true; } break; default: break; } return super.ontouchevent(event); } }
布局:
<?xml version="1.0" encoding="utf-8"?> <framelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/df_content" android:layout_width="match_parent" android:layout_height="match_parent"> <com.windfindtech.ishanghai.view.swipescrollview android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/default_white" android:scrollbars="none"> <relativelayout android:id="@+id/network_tab_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/default_white"> ........... </relativelayout> </com.windfindtech.ishanghai.view.swipescrollview> <com.windfindtech.ishanghai.view.dragimageview android:id="@+id/iv_drag_adver" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="right|top" android:src="@drawable/ic_launcher" /> </framelayout>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。