实现自定义View随手指移动的两种方法
程序员文章站
2022-03-06 21:37:52
实现自定义View随手指移动的两种方法一、通过setX,setY设置view坐标首先,用setOnTouchListener监听View控件,否则随意在屏幕上点一个点,view就跟着跑 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main...
实现自定义View随手指移动的两种方法
一、通过setX,setY设置view坐标
- 首先,用setOnTouchListener监听View控件,否则随意在屏幕上点一个点,view就跟着跑
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.v);
view.setOnTouchListener(viewtouchListener);
}
只粘了主要代码,在onCreate初始化方法里,设置view的监听
- 在onTouchListener里,自动重写的onTouch里,判断ACTION_DOWN, ACTION_MOVE所要出发的事件
View.OnTouchListener viewtouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
//获取触摸事件
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
touchx = (int) event.getX();
touchy = (int) event.getY();
} else if (action == MotionEvent.ACTION_MOVE) {
int x = (int) event.getRawX();
int y = (int) event.getRawY();
// 改变视图坐标
view.setX(x - touchx);
view.setY(y - touchy - 100); //把顶部状态栏的高度减下去就可以了
}
return true;
}
};
- 首先定义全局变量touchX,touchY,也就是getX和getY,意思是触摸点距自定义View边距的距离,来看ACTION_DOWN情况下,把touchX,touchY存起来就可以了,这时候不要用setX或者setY方法,否则会闪现。。。
- 然后看ACTION_MOVE情况,定义两个变量x,y,也就是getRawX,getRawY,意思是触摸点距离屏幕边距的距离,即绝对坐标。这时候,用setX,和setY方法,里面的参数是x - touchX , y - touchY。(这里说明一下,setX,setY方法设置的坐标是控件左上角的坐标,也就是说,这个减法是让自定义View左上角的坐标不变,导致自定义View整体不变。如果不这样做,手点一下控件,控件左上角会到你手点下去的那个点。)
- 这里我在y轴坐标我又减了100,是减去状态栏的高度,否则会每次都往下移动一个状态栏的高度。
- 最后return true,至此,第一种方法完事。
二、通过计算改变距离控件距离屏幕顶边和左边的距离,来改变位置
监听事件都是不变的,一定要监听控件。
这里插入一个 getLayoutParams()方法和setLayoutParams()方法 的使用说明:
- 首先利用getLayoutParams()方法,获取控件的LayoutParams
LayoutParams mParams=(LayoutParams)imageView.getLayoutParams();
- 设置该控件的layoutParams参数(根据自己需求)
参数里包含什么呢?一般有宽和高
mParams.height=200;
mParams.width=100;
- 将修改好的layoutParams设置为该控件的layoutParams.
imageView.setLayoutParams(mParams);
然后开始第二种方法:
- 在ACTION_DOWN里面赋值lastX,lastY。即getRawX,getRawY,触摸点距离屏幕边界的距离
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
- 在ACTION_MOVE里面
dx = (int) event.getRawX() - lastX;
dy = (int) event.getRawY() - lastY;
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
layoutParams.topMargin = layoutParams.topMargin + dy;
view.setLayoutParams(layoutParams);
RelativeLayout.LayoutParams layoutParams1 = (RelativeLayout.LayoutParams) view.getLayoutParams();
layoutParams1.leftMargin = layoutParams.leftMargin + dx;
view.setLayoutParams(layoutParams1);
dx, dy是移动的距离,我不知道为什么要再赋值一遍lastX,lastY,虽然这是必要且正确的,然后 通过上面介绍的getLayoutParams和setLayoutParams方法,改变layoutParams的topMargin和leftMargin,然后再传回给view控件
3.最后return true就可以了。
虽然内容看起来不多或者说很少,但找到这两种方法的过程还是挺曲折的,记录下来,以后也许会用到。
本文地址:https://blog.csdn.net/qq_43556200/article/details/107976399
推荐阅读
-
Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享
-
python开发之tkinter实现图形随鼠标移动的方法
-
Android自定义View实现绘制虚线的方法详解
-
Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享
-
Android实现在xml文件中引用自定义View的方法分析
-
python开发之tkinter实现图形随鼠标移动的方法
-
详解Angular中实现自定义组件的双向绑定的两种方法
-
Android自定义View实现绘制虚线的方法详解
-
Android自定义View实现游戏摇杆键盘的方法示例
-
Android自定义View实现跟随手指移动的小兔子