4

アプリをミラーリングして、車のフロント ガラスに表示できるようにしたいと考えています。

私の XML には、いくつかのネストされたLinearLayout、 、TextViewおよびがありImageViewます。現在、私はそれぞれを変換していますが、ミラーリングされていますが、要素の構造はそうではありません (上部にあったものは下部にあります)。

私は何日も探していましたが、これまでにいくつかのアプローチを試みましたが、失敗しました。

マトリックスを使用して X 軸でフリップするアニメーションは、元に戻るか、そのままで更新されないことを除けば、アプリとのやり取りには適していません。

LinearLayoutメソッドに Matrix を適用できることを期待して、親を拡張するカスタムを作成しようとしました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

新しい Animation API を使用して、水平方向の反転後に元に戻す処理を行うことができます。

于 2011-12-16T16:37:53.997 に答える