Android 实现拖动旋钮效果
Android 实现拖动按钮效果
思路:首先获取屏幕的宽度和高度,当移动Button 在ACTION_DOWN 的时记录下控件当前的位置坐标,在移动ACTION_MOVE时记录相对上次的坐标,然后算出相对于parent 的View上下左右位置,最后重新layout就可以。
public class DraftTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DisplayMetrics dm = getResources().getDisplayMetrics(); //获取屏幕宽和高 final int screenWidth = dm.widthPixels; final int screenHeight = dm.heightPixels - 50; final Button b=(Button)findViewById(R.id.btn); b.setOnTouchListener(new OnTouchListener(){ //上次view的坐标位置 int lastX, lastY; @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub int ea=event.getAction(); Log.i("TAG", "Touch:"+ea); switch(ea){ case MotionEvent.ACTION_DOWN: //按下记录view坐标 lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: //移动时记录相对上次的坐标 int dx =(int)event.getRawX() - lastX; int dy =(int)event.getRawY() - lastY; //相对于parent 的View上下左右位置 int left = v.getLeft() + dx; int top = v.getTop() + dy; int right = v.getRight() + dx; int bottom = v.getBottom() + dy; //如果left < 0,则是左移,右边框上次位置加上左移部分 if(left < 0){ left = 0; right = left + v.getWidth(); } // if(right > screenWidth){ right = screenWidth; left = right - v.getWidth(); } //如果top < 0,则是上移,下边框上次位置加上移部分 if(top < 0){ top = 0; bottom = top + v.getHeight(); } if(bottom > screenHeight){ bottom = screenHeight; top = bottom - v.getHeight(); } //重新layout v.layout(left, top, right, bottom); Log.i("", "position" + left +", " + top + ", " + right + ", " + bottom); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: break; } return false; }}); } }