2011-07-07 11 views
0

ListViewのフェードエッジは、android:cacheColorHintプロパティで制御できます。これはすべて非常に便利で便利です。色と強度の両方を設定することができます(カラープロパティにアルファを追加することによって)。Android ScrollViewとListViewのフェーディングエッジコントロール

論理的には、スクロールビューのフェードエッジも同様に制御することができます。しかし、いくつかの解決策がありますが、理想的ではありません。

  1. ScrollViewを拡張し、オーバーライド getSolidColor()関数。この は私が私が私が0x33000000を使用 場合、それは常に透明 フルにフルブラックから 勾配となりますので、しかし、色のアルファ値は無視され、好きな に色を変更することができます。
  2. ScrollViewsバックグラウンドプロパティを使用します。これは私に色と強度(アルファ値を通して)の両方のコントロールを与えますが、バックグラウンドをフェードの色に設定します。

誰かがこれに対してより良い解決策を見つけた場合、私の質問があります。バックグラウンドプロパティを使用せずにScrollViewsのフェードエッジの色と強度の両方を制御できるソリューション。

+0

update: ListViewsのように見えるcacheColorHintは、アルファ値も無視します。 shite。 – Joakim

答えて

6

ソリューション#2(ScrollViewの背景プロパティを使用)は、あなたが挙げた1つの問題(背景とフェードの色を異ならせたい場合がある)を乗り越えることができるために機能します。 [Android 1.6ベースの回答] don30-release2

これは、エッジが0x8800FF00にフェードして一般的な背景が違うところです(この場合、0x8800FF00の上に0x88FFFFFFが表示されますアルファは関連している)と子の背景には、(ボタン、黒と白のテキストセクションが不透明で)まだ異なっている:

enter image description here

お知らせレイアウトファイル内の背景設定:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ScrollView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#8800FF00" 
    > 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="#88FFFFFF" 
    > 
    <Button android:text="Hello no style" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
    ... 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 
    <LinearLayout 
     android:background="@android:color/black" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 
     <TextView android:textColor="#80ffffff" android:text="#80ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
     ... 
    </LinearLayout> 
    <LinearLayout 
     android:background="@android:color/white" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 
     <TextView android:textColor="#80ffffff" android:text="#80ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
     ... 
    </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 
</ScrollView> 

View.javaがエッジを適用する方法は、最初にScrollViewの背景(ある場合)を描画し、オフスクリーンビットマップ(ContentBitmap)でScrollViewのコンテンツを描画し、DST_OUT xfermodeのLinearGradientをエッジに適用することです。 DST_OUTはソースからのアルファのみを使用し、LinearGradient/DST_OUTはContentBitmapのエッジを徐々に透明と暗にします。 View.draw()は、ContentBitmapをSRC_OVER xfermode経由でメインキャンバスにマージします。これにより、以前に描画された背景が半透明のContentBitmapピクセルで表示されます。 adroid:colorCacheHintとして

ノート

、それはリストビュー(ただしScrollView)は順に、View.ScrollabilityCache.setFadeColor()を呼び出し、代わりDST_OUTのSRC_OVERのてLinearGradientを作成するView.draw()を引き起こす、View.getSolidColor()をオーバーライドするために使用する値です。 1。 setFadeColor()は、勾配をhintColor|0xFF000000から0x0までの範囲に設定します。また、SRC_OVERはContentBitmapの結果ピクセルを既に透明なものにしていないことに注意してください。このように、フェードの単色バリエーションは、実際にはフェードピクセルではなくペイント・フェード・エフェクト・オン・トップです透明である。

View.javaのフェーディングエッジ機能はプライベートです。あなたのサブクラスでそれを再実装することです。

リストア(ListActivityから取得)と同じ背景設定を試しましたが、フェードがバックグラウンドで正しく適用されているようです。別の日のためのパズル。

+0

@ジョアキムこれはまだ試しましたか? – cdhabecker

+0

うん。しかし、ListViewのフェーディングエッジは同じように動作します。 ScrollViewは今の魅力のように機能します。 – Joakim

+1

@Joakim素晴らしい!次のステップは、あなたの質問に答えるので、この回答を受け入れることです(投票アイコンの下の左側の枠内のチェックボックスをクリックします)。多くの場合、このディスカッションでは別の質問がありました.ListViewをScrollViewのようにフェードアウトさせる方法はありますか?新しい質問として提出する必要があります。別の質問を提出することで(そしてターゲットとなる回答を得ることによって)、他の人が同じタイプの問題を問い合わせることが容易になります。 – cdhabecker