2017-07-26 121 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還有什麼我可以嘗試澄清的嗎?你是否嘗試了這個建議? –