2011-09-26 4 views
15

ビューをマスクすることはできますか?たとえば、リストビューが楕円形の開口部内に表示されるように設計されたデザインがあるとします。ビューのマスクを作成する方法はありますか?それは別のものと呼ばれていますか?私がアンドロイドのドキュメントでマスキングするのは、キャンバスのオブジェクトや描画可能なオブジェクトをマスキングすることです。しかし、リストビューのようなインタラクティブなオブジェクトを描画可能にすることは良いアプローチになるとは思わない。これは現在対処するための制限にすぎませんか?アンドロイドでビューをマスクすることはできますか?

答えて

30

はい、それはです - あなたはあなたのビューの描画メソッドをオーバーライドする必要があります - すなわち:

...... 
final Path path = new Path(); 
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW); 
...... 
@Override 
protected void dispatchDraw(Canvas canvas){ 
    canvas.clipPath(path); 
    super.dispatchDraw(canvas); 
} 

これが唯一のパスで設定された境界線であなたのビューを描画します。

+1

を見つけることができますまた、あなたは好きな「マスク」効果を作成し、ちょうど独自のビューにそれを入れて、問題のビューの前に/それを岩下入れることができます。 1つの特定のビューに対してこのエフェクトが必要な場合は、独自のビューを作成して描画メソッドを編集する手間が省けます。 – FoamyGuy

+0

それは間違っているだろう、ティム。パフォーマンスが重要なモバイルプラットフォーム上に完全に不要なビュー階層を作成することで、アプリのパフォーマンスが低下します。 – asenovm

+0

私は、パフォーマンスが悪くなることに同意します。私は、彼が1つのアクティビティの中で1つのビューにそれを適用している場合、パフォーマンスの違いはそこにあるデバイス上で人間の目には気付かれないと主張する。別のビューでそれを行うと、描画メソッドをオーバーライドできるように独自のビューを作成しようとするよりも、人によってはあまり気にならないように思えるかもしれません。私はあなたのベルトの下にいくつかを得た後にそれを行うことが自明になることを知っています。しかし、これまでにそれをやったことがないなら、私には少し難しいかもしれないようです。 – FoamyGuy

10

はい、完全なレイアウトをマスクすることもできます。 恥知らずselfplug

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout 
android:id="@+id/frm_mask_animated" 
android:layout_width="100dp" 
app:porterduffxfermode="DST_IN" 
app:mask="@drawable/animation_mask" 
android:layout_height="100dp"> 

<ImageView android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/unicorn"/> 

あなたはそれをhere

関連する問題