【发布时间】:2011-05-10 13:45:25
【问题描述】:
我正在尝试镜像 LinearLayout。 为了完成这项工作,我扩展了 LinerLayout 以创建自己的 View 组件。
这就是它的样子:
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 接口并每隔几毫秒调用一次 invalidate() 时。
如果我只旋转画布而不使视图无效,则不会绘制子视图的更改。 现在我想知道这种行为的原因是什么,以及是否有办法让它在没有 Runnable/Handler 实现的情况下工作。 如果我删除行 canvas.rotate(...) 正确绘制子视图的更改(例如,这是一个经常更新自身的进度条。)
希望有人能帮忙! 非常感谢。 克里斯
【问题讨论】:
标签: android view canvas rotation mirroring