当前位置: 代码迷 >> Android >> android 兑现可拖动的Button
  详细解决方案

android 兑现可拖动的Button

热度:8   发布时间:2016-05-01 14:20:20.0
android 实现可拖动的Button
实现效果,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回到了初始化的位置。呵呵
  相关解决方案