当前位置: 代码迷 >> Android >> Android 实现拖动旋钮效果
  详细解决方案

Android 实现拖动旋钮效果

热度:103   发布时间:2016-04-27 23:26:43.0
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;			}});	}}

?

  相关解决方案