2017-07-26 122 views
1

我是Android新手,需要帮助。 在我的代码中,我使用onTouchEven()来移动ImageView,但invalidate()不会调用onDraw()。我正在寻找遍布互联网的解决方案,并且stil无法看到我的错误。请帮忙。invalidate()不会调用onDraw(),Android Studio

map - 这是我的ImageView我想拖动。

public class MainActivity extends AppCompatActivity { 
    TextView infoSpace; 
    ImageView map; 
    ImageButton updateButton; 
    String currentDateTimeString; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(com.example.eleizo.firstapplication.R.layout.activity_main); 

     map = (ImageView) findViewById(R.id.map); 

     map.setWillNotDraw(false); 
     map.setOnTouchListener(new View.OnTouchListener(){ 
      @Override 
      public boolean onTouch(View v, MotionEvent event){ 
       Context context = getApplicationContext(); 
       new CustomImageView(context).onTouchEvent(event); 
       return true; 
      } 
     }); 

    } 

    private class CustomImageView extends View { 

    private float mLastTouchX; 
    private float mLastTouchY; 
    private float mPosX; 
    private float mPosY; 

    //the active pointer is one currently moving object 
    private static final int INVALID_POINTER_ID = -1; 
    private int mActivePointerId = INVALID_POINTER_ID; 

     public CustomImageView(Context context) { 
      super(context); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      final int action = ev.getActionMasked(); 


      switch (action & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: { 
        Log.d("DEBUG","MotionEvent.ACTION_DOWN"); 
        final float x = ev.getX(); 
        final float y = ev.getY(); 
        mLastTouchX = x; 
        mLastTouchX = y; 
        mActivePointerId = ev.getPointerId(0); 
        break; 
       } 

       case MotionEvent.ACTION_MOVE: { 
        Log.d("DEBUG","MotionEvent.ACTION_MOVE"); 
        final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
        final float x = ev.getX(pointerIndex); 
        final float y = ev.getY(pointerIndex); 
        final float dx = x - mLastTouchX; 
        final float dy = y - mLastTouchY; 
        mPosX += dx; 
        mPosY += dy; 
        this.setX(x+mPosX); 
        this.setY(y+mPosY); 

        invalidate(); 
        Log.d("DEBUG",String.format("AFTER invalidate(): %f %f", mPosX, mPosY)); 

        mLastTouchX = x; 
        mLastTouchY = y; 

        break; 
       } 

       case MotionEvent.ACTION_UP: { 
        Log.d("DEBUG","MotionEvent.ACTION_UP"); 
        mActivePointerId = INVALID_POINTER_ID; 
        break; 
       } 

       case MotionEvent.ACTION_CANCEL: { 
        Log.d("DEBUG","MotionEvent.ACTION_CANCEL"); 
        mActivePointerId = INVALID_POINTER_ID; 
        break; 
       } 

       case MotionEvent.ACTION_POINTER_UP: { 
        Log.d("DEBUG","MotionEvent.ACTION_POINTER_UP"); 
        final int pointerIndex = ev.getActionIndex(); 
        final int pointerId = ev.getPointerId(pointerIndex); 

        if (pointerId == mActivePointerId) { 
         // This was our active pointer going up. Choose a new 
         // active pointer and adjust accordingly. 
         final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
         mLastTouchX = ev.getX(newPointerIndex); 
         mLastTouchY = ev.getY(newPointerIndex); 
         mActivePointerId = ev.getPointerId(newPointerIndex); 
        } 
        break; 
       } 
      } 
      return true; 
     } 

     @Override 
     protected void onDraw (Canvas canvas){ 
      Log.d("DEBUG","OnDraw()"); 
      super.onDraw(canvas); 
      canvas.save(); 
      canvas.translate(mPosX,mPosY); 
      canvas.restore(); 

     } 
    } 

当我触摸地图,我可以看到日志 “之后无效():..”
但从来没有看到日志 “的OnDraw()”。

回答

0
new CustomImageView(context).onTouchEvent(event); 

您不保存对您的CustomImageView对象的引用。你正在创建一个对象,你自己调用onTouchEvent,但是你没有存储一个引用或者引用onDraw的任何类。

也许让你CustomImageView类型的map对象,而不是ImageView

+0

很抱歉,但我不明白(我如何可以调用setOnTouchListener(新View.OnTouchListener()我会不会有地图吗? – Elena

+0

我暗示而不是使映射成为ImageView类型,使映射成为CustomImageView类型,你不需要一个单独的onTouch监听器来让你失效,映射本身就是你应该调用invalidate()的地方,并且你想让map的onDraw成为你不需要单独的触摸监听器, –

+0

@Elena还有什么我可以尝试澄清的吗?你是否尝试了这个建议? –