4

我希望能够镜像我的应用程序,以便可以在车辆的挡风玻璃上查看它。

我的 XML 有几个嵌套LinearLayout的 s、TextViews 和ImageViews。目前我正在改变每一个,虽然它是镜像的,但元素的结构不是(顶部的现在在底部)。

我一直在寻找几天,到目前为止已经尝试了几种失败的方法。

使用矩阵在 X 轴上翻转的动画是可行的,但它要么恢复原状,要么保持不变,不更新,这不利于与应用程序交互。

我只是尝试创建一个LinearLayout扩展父级的自定义,希望我可以在它的onDraw()方法中应用一个矩阵,但这给了我一个空白屏幕(我必须设置setWillNotDraw(false);点击onDraw())。

4

2 回答 2

3

好吧,最终我找到了一个适合我的解决方案(到目前为止,它没有给用户带来任何问题)。

我的解决方案是覆盖dispatchDraw以在我的自定义 LinearLayout 中缩放画布。然后我只需要通过覆盖来翻转触摸事件dispatchTouchEvent

public class CustomContainer extends LinearLayout {

    public CustomContainer(Context context) {
        super(context);
        this.setWillNotDraw(false); 
    }

    public CustomContainer(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setWillNotDraw(false); 
    }

    public CustomContainer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.setWillNotDraw(false); 
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        // Flip the view canvas
        if (MyHUDActivity.mHUDMode) canvas.scale(1,-1, getWidth(), getHeight()/2f); 
        super.dispatchDraw(canvas); 
        canvas.restore();
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        // If in HUD mode then flip the touch zones
        if (MyHUDActivity.mHUDMode) event.setLocation(event.getX(), getHeight()-event.getY());
        return super.dispatchTouchEvent(event); 
    }
}
于 2013-04-24T10:27:33.393 回答
0

您可以使用新的动画 api 来处理水平翻转后的还原。

于 2011-12-16T16:37:53.997 回答