`
johnnycmj
  • 浏览: 35615 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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;
			}});
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics