当前位置: 移动技术网 > 网络运营>服务器>Linux > 实现自定义View随手指移动的两种方法

实现自定义View随手指移动的两种方法

2020年08月14日  | 移动技术网网络运营  | 我要评论
实现自定义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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网