在定义的View中绘制了一个矩形,怎么实现可用随意拖动这个矩形呢?

解决方案 »

  1.   

    你是要拖动这个矩形还是要拖动这个View啊如果是拖动这个View,直接从View的触摸响应下手就行了如果你要拖动这个矩形的话,你需要在这个View的ondraw里面去处理先判断触摸点是不是在矩形上,然后处理拖动消息,然后根据实时位置画新的矩形因为你自己画的矩形,没控件给你用,什么都要自己处理
      

  2.   

    为什么只有我刚触屏的时候有反应,但我拖动都时候就没反应,MotionEvent.ACTION_MOVE,都没反应。
      

  3.   

    在onTouchEvent事件中处理,并且动作类型要是ACTION_MOVE,用getX,getY获取坐标。
    http://blog.csdn.net/ch_984326013/article/details/6654270
      

  4.   

    做好了,其实功能挺简单,有兴趣大看看吧。
    package Com.gqs;import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.graphics.Rect;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;public class TestView extends View{
    private Paint paint;
    private Rect r;
    private int dx=3;
    private int dy=3;
    private int upx=10;private int upy=10;
    private int downx=100;
    private int downy=100;
    public TestView(Context context) {
    super(context);
    paint=new Paint();
    r=new Rect(upx,upy,downx,downy);
    // TODO Auto-generated constructor stub
    }
    @Override
    protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
           Log.i("onDraw","画图");
    canvas.drawColor(Color.WHITE);
    paint.setColor(Color.BLUE);
    paint.setStyle(Style.STROKE);
    canvas.drawRect(r, paint);
    }
    public int getX() {
    return upx;
    }
    public void setX(int x) {
    upx = x;
    }
    public int getY() {
    return upy;
    }
    public void setY(int y) {
    upy = y;
    }

    public int getDownx() {
    return downx;
    }
    public void setDownx(int downx) {
    this.downx = downx;
    }
    public int getDowny() {
    return downy;
    }
    public void setDowny(int downy) {
    this.downy = downy;
    }
        public void update(int dx,int dy)
        {
        
         if(r.right+dx<=getWidth()&&r.left+dx>=0&&r.top+dy>=0&&r.bottom+dy<=getHeight())
         {
         r.offset(dx, dy);
         postInvalidate();
         }
        
        }
        
        
    }
    package Com.gqs;import android.R.integer;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.Window;
    import android.widget.Toast;/**
     * 
     *@author gqs
     *Date:Oct 12, 2011 8:48:08 AM
     */
    public class MoveViewActivity extends Activity {
        /** Called when the activity is first created. */
    TestView tv;
    private int x=0;
    private int y=0;
    private boolean isIn=true;
        @Override
        public void onCreate(Bundle savedInstanceState) {
        
            super.onCreate(savedInstanceState);
       
            tv=new TestView(this);
            requestWindowFeature(Window.FEATURE_NO_TITLE); 
            setContentView(tv);        tv.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) { int action=event.getAction();
    Log.i("action", action+"");

      switch(action){  
                    case MotionEvent.ACTION_DOWN:  
                     x=(int)event.getX();
         y=(int)event.getY();
        
         if(x>=tv.getX()&&x<=tv.getDownx()&&y>=tv.getY()&&y<=tv.getDowny())
         {
         Toast.makeText(getApplicationContext(),"在矩形内",Toast.LENGTH_SHORT).show();
         isIn=true;      }
                        break;  
            
                    case MotionEvent.ACTION_MOVE:
                      
                         if(isIn==true)
                         {
                          int mx=(int)event.getX();
                          int my=(int)event.getY();
                          Toast.makeText(getApplicationContext(),mx+"",Toast.LENGTH_SHORT).show();
                          Log.i("mx", my+"");
                          Log.i("my", my+"");
                          int dx=mx-x;
                          int dy=my-y;
                          
                          tv.update(dx, dy);
                          x=(int)event.getX();
                          y=(int)event.getY();
                          
                         }
                          
                        break;  
                    case MotionEvent.ACTION_UP:  
                        break;                
                    }  
    return true;
    }
    });
        }
    }
      

  5.   

    不错。楼主有兴趣可以去做一个android 画图。去网上下载一个矢量画图的java代码。移植到android上就可以了。
      

  6.   

    package Com.gqs;import android.R.integer;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.Window;
    import android.widget.Toast;/**
     * 
     *@author gqs
     *Date:Oct 12, 2011 8:48:08 AM
     */
    public class MoveViewActivity extends Activity {
        /** Called when the activity is first created. */
    TestView tv;
    private int x=0;
    private int y=0;
    private boolean isIn=true;
    private int lastx;
    private int lasty;
        @Override
        public void onCreate(Bundle savedInstanceState) {
        
            super.onCreate(savedInstanceState);
       
            tv=new TestView(this);
            requestWindowFeature(Window.FEATURE_NO_TITLE); 
            setContentView(tv);
      
            tv.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) { int action=event.getAction();
    Log.i("action", action+"");
    //    Log.i("upx", tv.getX()+"");
      switch(action){  
                    case MotionEvent.ACTION_DOWN:  
                     x=(int)event.getX();
         y=(int)event.getY();
             
         if(x>=tv.Left()&&x<=tv.right()&&y>=tv.top()&&y<=tv.bottom())
         {
         Toast.makeText(getApplicationContext(),"在矩形内",Toast.LENGTH_SHORT).show();
         isIn=true;      }
                        break;  
            
                    case MotionEvent.ACTION_MOVE:
                      
                         if(isIn==true)
                         {
                          int mx=(int)event.getX();
                          int my=(int)event.getY();
    //                       Toast.makeText(getApplicationContext(),mx+"",Toast.LENGTH_SHORT).show();
                          Log.i("mx", my+"");
                          Log.i("my", my+"");
                          int dx=mx-lastx;
                          int dy=my-lasty;
                      
                          tv.update(dx, dy);
                          lastx=(int)event.getX();
                          lasty=(int)event.getY();
                          
                         }
                          
                        break;  
                    case MotionEvent.ACTION_UP:  
                     isIn=false;
                        break;                
                    }  
    return true;
    }
    });
        }
    }package Com.gqs;import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.graphics.Rect;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;public class TestView extends View{
    private Paint paint;
    private Rect r;
    private int upx=10;
    private int upy=10;
    private int downx=100;
    private int downy=100;
    public TestView(Context context) {
    super(context);
    paint=new Paint();
    r=new Rect(upx,upy,downx,downy);
    // TODO Auto-generated constructor stub
    }
    @Override
    protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
           Log.i("onDraw","画图");
    canvas.drawColor(Color.WHITE);
    paint.setColor(Color.BLUE);
    paint.setStyle(Style.STROKE);
    canvas.drawRect(r, paint);
    } public int Left()
    {
    return r.left;
    }
    public int right()
    {
    return r.right;
    }
    public int top()
    {
    return r.top;
    }
    public int bottom()
    {
    return r.bottom;
    }
        public void update(int dx,int dy)
        {    
         if(r.right+dx<=getWidth()&&r.left+dx>=0&&r.top+dy>=0&&r.bottom+dy<=getHeight())
         {
         r.offset(dx, dy);
         postInvalidate();     }
        
        }
        
        
    }
    这就对了,下午又试了试 ,那个有问题