Android简易实战教程--第四十九话《满屏拖动的控件》

今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完。

说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了。


直接上简单的代码吧:

public class MainActivity extends Activity implements View.OnTouchListener {
    private Button mButton;
    private ViewGroup mViewGroup;
    private int xDelta;
    private int yDelta;
    public static final String TAG = "YDL";
    private RelativeLayout.LayoutParams mParams;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mViewGroup = (ViewGroup) findViewById(R.id.root);

        mButton = (Button) findViewById(R.id.id_text);

        mParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        mParams.leftMargin = 50;
        mParams.topMargin = 50;

        mButton.setLayoutParams(mParams);

        mButton.setOnTouchListener(this);

    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        //手指触摸控件,就会执行这里。鼠标点击控件位置相对屏幕的坐标
        final int x = (int) event.getRawX();
        final int y = (int) event.getRawY();
        Log.d(TAG, "onTouch: x= " + x + "y=" + y);//x= 192y=185
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDelta = x - mParams.leftMargin;//xDelta= 142192-50yDelta=135185-50)得到控件相对自己的坐标位置。(鼠标点击点距离控件左上角)
                yDelta = y - mParams.topMargin;
                Log.d(TAG, "ACTION_DOWN: xDelta= " + xDelta + "yDelta=" + yDelta);//xDelta= 142yDelta=135
                break;
            case MotionEvent.ACTION_MOVE:

                int xDistance = x - xDelta;//x= 199y=185(鼠标移动后下一位置的坐标)- 鼠标相对控件本身的坐标 = 控件位于屏幕上的新坐标位置       xDistance= 57yDistance=50
                int yDistance = y - yDelta;
                Log.d(TAG, "ACTION_MOVE: xDistance= " + xDistance + "yDistance=" + yDistance);//xDistance= 57yDistance=50

                mParams.leftMargin = xDistance;//把新坐标位置设置给控件
                mParams.topMargin = yDistance;
                view.setLayoutParams(mParams);//把坐标位置重新赋值给button
                break;
        }
        return true;
    }


MainActivity实现了OnTouchListener接口,覆写了onTouch方法,每次回调这个方法通过x和y变量记录当前的坐标。

ACTION_DOWN是在按下的时候调用(没抬起来只调用一次),通过xDelta和yDelta来记录第一次按下的点相对于控件左上角的位置,也就是相对距离。

ACTION_MOVE移动的时候不断调用,通过xDistance和yDistance来记录移动的相对距离作为leftMargin和topMargin再动态设置给控件。

最后,调用setLayoutParams方法重新设置控件坐标位置。


文字解释不够多?下面一张图应该更清楚吧?


运行程序快点满屏跑动吧!


喜欢我的朋友可以关注我的博客专栏。

也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

微信公众号图片:



原文地址:https://www.cnblogs.com/wanghang/p/6299468.html