AndroidのDrawable

11945 ワード

Drawableの概要
Drawableといえば、最初の反応は画像を保存する場所に違いないが、実際には、Drawableは画像だけではない.色の塗りつぶしなどの画像の概念として理解したり、画像として理解したりすることができます.
Drawableクラスは、BitmapDrawable、ShapeDrawable、LayerDrawable、StateListDrawableなどの一般的なサブクラスを持つ抽象クラスです.
BitmapDrawable
BitmapDrawableは、src属性によって指向するピクチャリソースを定義し、そのピクチャに関連する主な属性を以下のように設定したピクチャです.


//          :
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
        BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
        bitmapDrawable.setTileModeXY(Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        bitmapDrawable.setAntiAlias(true);
        bitmapDrawable.setDither(true);

一般的な画像に対するBitmapDrawableのほか、NinePatchDrawableは.9ピクチャに対応し、BitmapDrawableと同様にルートラベルはnine-patch
ColorDrawable
ColorDrawableは純粋な色で領域を塗りつぶし、使用も最も簡単で、1つの属性しかありません.color:


//    :
ColorDrawable colorDrawable = new ColorDrawable(0xffff0000);
//    :
mImageView.setBackground(new ColorDrawable(0xffff0000));
mImageView.setBackgroundColor(Color.argb(255,00,255,00));

Androidでは色の設定にARGBモードを採用しており、xmlではalpha値を指定しなくてもよいが、コードで16進数で色を設定する場合はalpha値を設定しなければならない.そうしないとデフォルトは0 x 00で、全透明で、色が見えない.
GradientDrawable(ShapeDrawable)
GradientDrawableは、線形グラデーション、発散グラデーション、およびフラットグラデーションを実現するグラデーション領域を表します.主なプロパティは次のとおりです.
//  Shape  ,rectangle(  ),oval(  ),line(  ),ring(  )     

    
    //   false,   Drawable  StateListDrawable     true
    
    //    
    
    


LayerDrawable
LayerDrawableは複数のitemを含み、各itemは1つのdrawableを表し、LayerDrawableは含まれるitemを異なる階層に配置し、最初のitemは最下層にあり、順次上に重ねます.

    
        
            
            
        
    
    
        
            
            
        
    


itemサブノードはDrawableを直接定義するかandroid:drawableプロパティを使用してDrawableを参照できます.layer-listにはプロパティノードがなく、Itemサブノードのみが含まれます.Itemノードのプロパティにはandroid:drawableのほか、android:top/left/right/bottomを使用して各方向のオフセット距離を設定します.
StateListDrawable
StatelistDrawableもDrawableの集合であり、各DrawableはViewの背景を設定するために使用される限り、Viewのステータスに対応します.selectorラベルを使用します.

    //          。             


システムはViewの現在の状態に基づいてselectorから対応するitemを選択し、選択すると上下から最初の一致するitemが見つかり、通常はデフォルトのitemを最後に設定し、何も設定しません.これにより、システムが上のitemに対応する状態が見つからない場合、最後のデフォルトのitemが選択され、任意の状態が付属せず、従って状態に一致することができます.

    
    
    
    
    
    
    
    
    
    
    
    

//      Drawable

LevelListDrawable

LevelListDrawable也是一系列Drawable集合,它通过Level来匹配item。





itemサブノードはDrawableを指定する以外に、2つの属性android:maxLevelのみが最高レベル(10000)を指定し、android:minLevelは最低レベル(0)を指定し、この2つの値の間でitemに一致します.マッチングするときも上から下へ、適切なitemにマッチングするまでです.したがって、通常はmaxLevelを指定するだけでいいので、itemをmaxLevelで小さいものから大きいものまで順番に並べます.
Levelの設定はDrawableのsetLevelメソッドで設定します.ImageViewとしての前景であれば、ImageViewのsetImageLevelで設定することもできます.
TransitionDrawable
transitionは実はlayer-listから継承されていますが、transitionは2層drawableしか管理できません.また、2層drawable間を切り替える方法が提供されており、切り替え時にはフェードアウトされたアニメーション効果もあります.サンプルコードは次のとおりです.

    
    


次に、コントロールで背景を指定します.

transition标签生成的Drawable对应的类为TransitionDrawable,要切换时,需要主动调用TransitionDrawable的startTransition()方法,参数为动画的毫秒数,也可以调用reverseTransition()方法逆向切换。

Button mButton = (Button) findViewById(R.id.btn1);
TransitionDrawable transitionDrawable = mButton.getBackground();
transitionDrawable.startTransition(500); //    ,     drawable      
transitionDrawable.reverseTransition(500); //    ,     drawable      

InsetDrawable
InsetDrawableはラベルを使用して、指定したDrawableを自分の中に埋め込むことができます.特に周囲の間隔を設定することができます.背景として、背景とview枠の距離を設定し、layerListでも実現できます.
android:drawable   drawable  ,        ,     drawable      
android:visible           ,   false
android:insetLeft    
android:insetRight    
android:insetTop     
android:insetBottom     
android:inset       ,         , API Level   21, Android 5.0

ScaleDrawable
ScaleDrawableは、指定したdrawableをスケールできるラベルを使用します.そのscaleGravityプロパティはBItmapと同じ役割を果たします.また、scaleHeightとscaleWidtは幅と高さのスケールを指定し、パーセンテージ値を受信する2つの特殊な属性もあります.なお、ScaleDrawableのスケーリング効果は、scaleHeightとscaleWidthだけでなく、Levelも指定します.デフォルトのLevelは0ですが、ScaleDrawableでは描画されません.次に例を示します.
//API 24     
//      :          ,    Level,        
    
//  Level:
mScaleImageView.setImageLevel(1);

なお、スケールに対するLevelの影響は、Level値が大きいほどDrawableが大きくなり、10000(Level最大値)に設定すると、スケールの設定にかかわらずスケールは行われません.一方、scaleHeightはscaleWidthとは逆に値が大きいほどDrawableは小さくなります.
ClipDrawable
ClipDrawableはDrawableを裁断するために使用され、Levelによって裁断範囲を決定し、10000は裁断しないことを示し、0はすべて裁断することを示し、見えなくなった.裁断の方向はclipOritationによってverticalとhorizontalを設定し、それ以外にもclipOritationとともに裁断方法を決定するGravity属性があります.Gravityには次の値があります.
top:Drawableはコンテナの上部に、垂直に裁断するときは下部からbottom:Drawableはコンテナの下部に、垂直に裁断するときは上部からleft:デフォルト.Drawableは容器の左側に置いて、水平に裁断する時右側からright:右側に置いて、水平に裁断するのは左からcenter_vertical:Drawable縦中央、大きさを変えず縦裁断上下から同時にfile_vertical:容器を垂直方向に充填します.垂直に裁断する場合、clipDrawableのレベルが0の場合のみ、裁断行為center_horizontal:水平中央、大きさを変えず、水平裁断は左右から同時にfill_horizontal:水平充填、水平剪断clipDrawableのレベルが0の場合にのみ、剪断動作center:水平と垂直が中央、垂直方向上下、水平方向左右同時にfillを剪断する:水平と垂直方向充填容器、clipDrawableのレベルが0の場合にのみ、剪断動作があります
その他のラベル
  • rotateラベルは、Drawableの回転を制御するために使用されます.主に次のプロパティが使用されます.
    Android:drawableはdrawableリソースを指定します.このプロパティを設定しない場合は、drawableタイプのサブラベルandroid:fromDegreesから始まる角度度数android:toDegreesから終わる角度度数を定義することもできます.正数は時計回り、負数は反時計回りandroid:pivotX回転中心のX座標、浮動小数点数またはパーセントを表します.浮動小数点数はdrawableに対する左辺距離の単位がpxであることを示し、例えば5である.パーセンテージはdrawableの左端距離に対してパーセンテージで計算され、例えば5%である.別のパーセンテージは、親コンテナに対する左縁、例えば5%pを表す.一般に50%に設定するとdrawable中心android:pivotY回転中心のY座標android:visibleで初期の可視性状態が設定され、デフォルトはfalse
    1枚の画像を180度回転するコードは以下の通りです:
  • 
    

    rotateも同様にLevelと関係がある.Level値は0-10000からそれぞれfromDegreesとtoDegreesに対応し、例えばLevel設定5000は90度回転します.レベル値はデフォルトで0なので、デフォルトでは回転しませんが、回転する場合はandroid:fromDegreesを直接180度設定して、開始した状態で回転が完了します.
  • animation-listは、一連のdrawableをフレームアニメーションに構築するために使用されます.itemサブラベルを追加することで、フレームごとに使用されるdrawableリソースと、フレームごとに持続する時間を設定します.サンプルコードは次のとおりです:
  • 
        
        
        
    
    

    Android:oneshotプロパティでループ再生するかどうかを設定し、trueに設定すると、1ラウンドだけ再生が終了しfalseに設定すると、再生がポーリングされます.Android:durationプロパティは、フレームの持続時間をミリ秒単位で設定します.アニメーション-list対応のDrawableクラスはAnimationDrawableで、アニメーションを実行するには、AnimationDrawableのstart()メソッドをアクティブに呼び出す必要があります.また、ActivityのonCreate()メソッドでstart()メソッドを直接呼び出すと効果がありません.viewはまだ初期化されていないのでアニメーションは再生できません.
  • animation-rotate rotateラベルは、元のdrawableを別のdrawableに角度を変えるだけで、静的です.animated-rotateはdrawableを回転アニメーションにし続けます.animated-rotateで設定できるプロパティは4つしかありません:
  • Android:drawable drawableリソースを指定します.このプロパティを設定しない場合は、drawableタイプのサブラベルandroid:pivotX回転中心のX座標android:pivotY回転中心のY座標android:visibleを定義して初期の可視性状態を設定することもできます.デフォルトはfalseです
    サンプルコード: