1
我想要鏡像LinearLayout。 爲了完成這項工作,我擴展了LinerLayout來創建我自己的視圖組件。重寫dispatchDraw時不會自動繪製視圖
這是什麼樣子:
public class FlipLayout extends LinearLayout implements Runnable {
private boolean isMirroring = true;
private Handler handler;
public FlipLayout(Context context) {
super(context);
this.setWillNotDraw(false);
}
public FlipLayout(Context context, AttributeSet attr) {
super(context, attr);
this.setWillNotDraw(false);
handler = new Handler();
handler.postDelayed(this, 30);
}
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.save();
if (isMirroring) {
canvas.rotate(180, getWidth()/2, getHeight()/2);
}
super.dispatchDraw(canvas);
canvas.restore();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (isMirroring)
event.setLocation(getWidth() - event.getX(),
getHeight() - event.getY());
return super.dispatchTouchEvent(event);
}
@Override
public void run() {
invalidate();
handler.postDelayed(this, 30);
}
}
該類運作良好,但只實現Runnable接口時,並通過調用無效()每隔幾毫秒。
如果我只旋轉畫布而不使視圖失效,則不會繪製子視圖的更改。 現在我想知道這種行爲的原因是什麼,以及如果沒有Runnable/Handler實現的情況下獲得它的方式。 如果我刪除行canvas.rotate(...)子視圖的變化繪製正確(例如,這是一個進度條,它是經常更新自己。)
我希望有人可以幫助! 非常感謝。 Chris
好吧,我明白你的意思了。但爲什麼然後視圖被正確繪製(與所有子視圖更新)而不進行旋轉? 我試圖在旋轉畫布後立即使視圖無效。這也工作得很好。但是我已經在另一個論壇上看到,從dispatchDraw()中調用invalidate()並不是一個好主意,因爲invalite()本身會導致dispatchDraw()被執行 - 但我不確定這是否正確。 – 2011-05-10 14:25:21
我不確定你到底在做什麼,但我可以告訴你,Gui有兩種變化。正常的變化:例如,如果您滾動,滾動條必須移動。異常變化:我刪除一個按鈕並添加一個文本視圖。正常的更改將自動反映在屏幕上,因爲它是框架功能的一部分。異常更改是您決定用作程序員的高級函數,而您需要手動刷新Gui。對於你的調度問題,也許你可以嘗試在調度方法之外移動旋轉代碼。 – Joel 2011-05-10 14:33:00