欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

实现自定义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坐标

  1. 首先,用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的监听

  1. 在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,是减去状态栏的高度,否则会每次都往下移动一个状态栏的高度。
  1. 最后return true,至此,第一种方法完事。

二、通过计算改变距离控件距离屏幕顶边和左边的距离,来改变位置

监听事件都是不变的,一定要监听控件。

这里插入一个 getLayoutParams()方法和setLayoutParams()方法 的使用说明:

  1. 首先利用getLayoutParams()方法,获取控件的LayoutParams
  	    LayoutParams mParams=(LayoutParams)imageView.getLayoutParams();
  1. 设置该控件的layoutParams参数(根据自己需求)
    参数里包含什么呢?一般有宽和高
		mParams.height=200;
        mParams.width=100;
  1. 将修改好的layoutParams设置为该控件的layoutParams.
        imageView.setLayoutParams(mParams);

然后开始第二种方法:

  1. 在ACTION_DOWN里面赋值lastX,lastY。即getRawX,getRawY,触摸点距离屏幕边界的距离
		lastX = (int) event.getRawX();
		lastY = (int) event.getRawY();
  1. 在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