2013-08-24 6 views
12

その範囲内に表示されている下のすべてにカラーフィルタを適用する方法で、ビューを設定することは可能ですか?この例のように:その下のすべての色を反転PorterDuffの色彩効果は、特定のビューのビューのためにアンドロイドにあります

filtering view

だけのシンプルな長方形の眺め。もちろん、ユーザーがリストをスクロールすると、反転ボックスにも反映されます。カラーフィルター、PorterDuffモードなどを使用して簡単に行う方法はありますか?

答えて

12

あなたは、このようなビュー階層を使用してこの問題を解決しようとしている:

    • のListView
    • InverterView

問題がInverterViewは何のコントロールの上に持っていない、この位置では、どのようにListViewが描画されます。しかし、あなたは誰がどのように制御されているのかわかりますListViewが描かれていますか? ListViewの親のレイアウトはそうです。言い換えれば、あなたが本当にしたいことは、このような階層構造である:

    • InverterLayout

ListViewコントロールは今InverterLayoutListViewを描画するための責任があり、そしてそれにエフェクトを適用することができます。

class InverterLayout extends FrameLayout 
{ 
    // structure to hold our color filter 
    private Paint paint = new Paint(); 
    // the color filter itself 
    private ColorFilter cf; 
    // the rectangle we want to invert 
    private Rect inversion_rect = new Rect(100, 100, 300, 300); 

    public InverterLayout(Context context) 
    { 
     super(context); 
     // construct the inversion color matrix 
     float[] mat = new float[] 
     { 
      -1, 0, 0, 0, 255, 
      0, -1, 0, 0, 255, 
      0, 0, -1, 0, 255, 
      0, 0, 0, 1, 0 
     }; 
     cf = new ColorMatrixColorFilter(new ColorMatrix(mat)); 
    } 

    @Override protected void dispatchDraw(Canvas c) 
    { 
     // create a temporary bitmap to draw the child views 
     Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); 
     Canvas cc = new Canvas(b); 
     // draw them to that temporary bitmap 
     super.dispatchDraw(cc); 
     // copy the temporary bitmap to screen without the inversion filter 
     paint.setColorFilter(null); 
     c.drawBitmap(b, 0, 0, paint); 
     // copy the inverted rectangle 
     paint.setColorFilter(cf); 
     c.drawBitmap(b, inversion_rect, inversion_rect, paint); 
    } 
} 

これを使用して、あなたの子ビューは、独自の背景を持っていることを確認します。ビューが透明で、ウィンドウの背景が透けて見える場合、そのウィンドウの背景は反転されません。これは、InverterLayoutがウィンドウの描画方法を制御していないためです。ここで

1

もし私がここで正しいと確信できないので、私は単にコメントすることができます。バイヤーは注意してください。

私はあなたがView.OnDragEve [] ntListenerを利用してこの効果を達成することができると思います。ここにはdocumentationがあります。

私はあなたがアンドロイドで使用されるドラッグアンドドロップトリガーモデル(つまり、アプリとOSの間の通信手段)を調整する必要があると思います。どのように調整するかは、アプリ内の1つの視点を別のビューの境界に強制するメカニズムに完全に依存します。これを理解したら、 ColorMatrix,PorterDuffColorFilterなどの高度なカラーマジックを使用できます。

これは、代替Xfermodeよりもずっと簡単です。がんばろう!

1

は私がどうなるのかです:

ビュー階層:

  • RelativeLayout(またはでframeLayout)
    • のListView
      • がCustomInverterView

InverterViewはonTouchListenerで親ビューのOnTouch(RelativeLayout) によって位置決めされます:

if (event.getAction() == MotionEvent.ACTION_MOVE) 
      // Set Coordinates for the custom View. 
      // Copy the bitmapCache of the ListView (jsut the portion you need 
      // and send it to the customView. 
      // Apply the filters you want. 
      // Invalidate! 

私はこの方法を使用して拡大鏡を実施しました。それは魅力のように働く。たぶん後でコードを投稿することもできますが、私はちょっと忙しいです。

関連する問題