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()」。
很抱歉,但我不明白(我如何可以調用setOnTouchListener(新View.OnTouchListener()我會不會有地圖嗎? – Elena
我暗示而不是使映射成爲ImageView類型,使映射成爲CustomImageView類型,你不需要一個單獨的onTouch監聽器來讓你失效,映射本身就是你應該調用invalidate()的地方,並且你想讓map的onDraw成爲你不需要單獨的觸摸監聽器, –
@Elena還有什麼我可以嘗試澄清的嗎?你是否嘗試了這個建議? –