如何镜像整个显示屏?

4

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

我的XML有几个嵌套的LinearLayout,TextView和ImageView。目前,我正在转换每一个元素,虽然它是镜像的,但元素的结构不是(原来在顶部的现在在底部)。

我已经寻找了几天,尝试了几种失败的方法。

使用矩阵在X轴上翻转的动画有点奏效,但它要么恢复原样,要么停留不更新,这对于与应用程序交互没有好处。

我刚试图创建一个自定义的LinearLayout,扩展父级LinearLayout,希望我可以在其onDraw()方法中应用Matrix,但这给我一个空白屏幕(我必须设置setWillNotDraw(false);来调用onDraw())。


很酷的想法。听起来很有趣。 - fredley
哼,好的,我想知道我的问题的其余部分去哪了!不用说,我的最后一次尝试也没有成功,现在我很困惑。 - Mr Chops
我只是在想:是否有可能在较低的层面上进行更改,以将整个系统输出镜像到屏幕上?这肯定需要 root 权限,但对于没有此功能的应用程序来说,这是一个很棒的黑客技巧,可以在挡风玻璃上显示它们。 - bcelary
2个回答

3

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

我的解决方案是在自定义LinearLayout中覆盖 dispatchDraw 以缩放画布。然后,我只需要通过覆盖 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); 
    }
}

0

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


谢谢,这是否意味着它将保持最终状态,并且仍然会重新绘制,就像没有进行动画处理一样?我最好去查看一下这个新API的文档。 - Mr Chops
我对这个不是百分之百确定,但如果我的记忆没有出错的话,是的,没错。 - josephus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接