`
亚当爱上java
  • 浏览: 697760 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

运行效果如下:




  • 大小: 16.8 KB
  • 大小: 17.2 KB
  • 大小: 16.8 KB
分享到:
评论
5 楼 亚当爱上java 2014-08-01  
midsummer 写道
亲测,其他控件一动,这个按钮又回来原来的位置了,将按钮放到frameLayout下面也是一样

统一回复一下,javaeye上发表的文章很多是我初学阶段的心得体会,难免有不少理解错误的地方,有空我会做一个系统性的修复,以免误导大家。加油,骚年们!
4 楼 midsummer 2014-07-30  
亲测,其他控件一动,这个按钮又回来原来的位置了,将按钮放到frameLayout下面也是一样
3 楼 gundumw100 2011-10-12  
我始终觉得,采用v.layout(l, t, r, b);这种方式去实现拖动表面上看是没问题,但实际是有问题的。
当界面上还有一个EditText,点击EditText弹出输入法的时候问题就来了,原本拖动了的Button回到了初始化的位置。呵呵
2 楼 亚当爱上java 2011-10-12  
bear1122ccc 写道
我用的是楼主的代码,但是为什么走的是Z字型路线呢?

没有呀,我刚拿这个代码试了下,可以任意拖动,一切OK.
1 楼 bear1122ccc 2011-10-09  
我用的是楼主的代码,但是为什么走的是Z字型路线呢?

相关推荐

Global site tag (gtag.js) - Google Analytics