实现效果,Buttton在屏幕范围内到处拖动,但不会拖出屏幕,代码如下:
public class DraftTest extends Activity { @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(){ 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: lastX=(int)event.getRawX();//获取触摸事件触摸位置的原始X坐标 lastY=(int)event.getRawY(); break; case MotionEvent.ACTION_MOVE: int dx=(int)event.getRawX()-lastX; int dy=(int)event.getRawY()-lastY; int l=v.getLeft()+dx; int b=v.getBottom()+dy; int r=v.getRight()+dx; int t=v.getTop()+dy; //下面判断移动是否超出屏幕 if(l<0){ l=0; r=l+v.getWidth(); } if(t<0){ t=0; b=t+v.getHeight(); } if(r>screenWidth){ r=screenWidth; l=r-v.getWidth(); } if(b>screenHeight){ b=screenHeight; t=b-v.getHeight(); } v.layout(l, t, r, b); lastX=(int)event.getRawX(); lastY=(int)event.getRawY(); Toast.makeText(DraftTest.this, "当前位置:"+l+","+t+","+r+","+b, Toast.LENGTH_SHORT).show(); v.postInvalidate(); break; case MotionEvent.ACTION_UP: break; } return false; }}); }}
运行效果如下:
1 楼 bear1122ccc 2011-10-09
我用的是楼主的代码,但是为什么走的是Z字型路线呢?
2 楼 亚当爱上java 2011-10-12
bear1122ccc 写道
我用的是楼主的代码,但是为什么走的是Z字型路线呢?
没有呀,我刚拿这个代码试了下,可以任意拖动,一切OK.
3 楼 gundumw100 2011-10-12
我始终觉得,采用v.layout(l, t, r, b);这种方式去实现拖动表面上看是没问题,但实际是有问题的。
当界面上还有一个EditText,点击EditText弹出输入法的时候问题就来了,原本拖动了的Button回到了初始化的位置。呵呵
当界面上还有一个EditText,点击EditText弹出输入法的时候问题就来了,原本拖动了的Button回到了初始化的位置。呵呵