2011-12-16 6 views
4

私は車のフロントガラスで見ることができるように私のアプリをミラーすることができるようにしたい。ディスプレイ全体をどのようにミラーリングできますか?

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

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

X軸の種類の作品を反転するために行列を使用するアニメーションですが、元に戻ったり、元に戻ったり、更新されたりすることはありません。

私はちょうど私がそのonDraw()方法でマトリックスを適用することができることを期待して、親1を拡張するカスタムLinearLayoutを作成しようとしましたが、それは私に空白の画面を(私はonDraw()をヒットするsetWillNotDraw(false);を設定する必要がありました)が得られます。

+0

のように修正しました。興味深いですね。 – fredley

+0

Hmmm、ok私は質問の残りの部分がどこに行くのだろうか!言うまでもなく、私の最後の試みはうまくいかず、今私は困惑しています。 –

+0

私はちょうど不思議に思っていました:システム全体の出力を画面に反映できる下位レイヤーを変更する機会がありますか?それは間違いなくルート権限を必要とするでしょうが、そのような機能がないアプリでは、フロントガラスに表示するのが大変です。 – bcelary

答えて

0

新しいアニメーションAPIを使用して、水平フリップの後に元に戻すことができます。

+0

ありがとう、それはそれが最終状態にとどまり、まだアニメーション化されていないかのように再描画することを意味しますか?私はよくこの新しいAPIのためのドキュメントを見てください。 –

+0

私はこれで100%ではありませんが、私の記憶が私に正しければ、そうです。 – josephus

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); 
    } 
} 
関連する問題