今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点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= 142(192-50)yDelta=135(185-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文章。
微信公众号图片: