その範囲内に表示されている下のすべてにカラーフィルタを適用する方法で、ビューを設定することは可能ですか?この例のように:その下のすべての色を反転PorterDuffの色彩効果は、特定のビューのビューのためにアンドロイドにあります
だけのシンプルな長方形の眺め。もちろん、ユーザーがリストをスクロールすると、反転ボックスにも反映されます。カラーフィルター、PorterDuffモードなどを使用して簡単に行う方法はありますか?
その範囲内に表示されている下のすべてにカラーフィルタを適用する方法で、ビューを設定することは可能ですか?この例のように:その下のすべての色を反転PorterDuffの色彩効果は、特定のビューのビューのためにアンドロイドにあります
だけのシンプルな長方形の眺め。もちろん、ユーザーがリストをスクロールすると、反転ボックスにも反映されます。カラーフィルター、PorterDuffモードなどを使用して簡単に行う方法はありますか?
あなたは、このようなビュー階層を使用してこの問題を解決しようとしている:
問題がInverterView
は何のコントロールの上に持っていない、この位置では、どのようにListView
が描画されます。しかし、あなたは誰がどのように制御されているのかわかりますListView
が描かれていますか? ListView
の親のレイアウトはそうです。言い換えれば、あなたが本当にしたいことは、このような階層構造である:
ListViewコントロールは今InverterLayout
はListView
を描画するための責任があり、そしてそれにエフェクトを適用することができます。
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
がウィンドウの描画方法を制御していないためです。ここで
もし私がここで正しいと確信できないので、私は単にコメントすることができます。バイヤーは注意してください。
私はあなたがView.OnDragEve [] ntListenerを利用してこの効果を達成することができると思います。ここにはdocumentationがあります。
私はあなたがアンドロイドで使用されるドラッグアンドドロップトリガーモデル(つまり、アプリとOSの間の通信手段)を調整する必要があると思います。どのように調整するかは、アプリ内の1つの視点を別のビューの境界に強制するメカニズムに完全に依存します。これを理解したら、 ColorMatrix,PorterDuffColorFilterなどの高度なカラーマジックを使用できます。
これは、代替Xfermodeよりもずっと簡単です。がんばろう!
は私がどうなるのかです:
ビュー階層:
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!
私はこの方法を使用して拡大鏡を実施しました。それは魅力のように働く。たぶん後でコードを投稿することもできますが、私はちょっと忙しいです。