Android 自定義Drawable

1.使用BitmapShader實現圖片圓角html

public class CornerDrawable extends Drawable {
    private Paint mPaint;
    private Bitmap bmp;
    private RectF rectF;

    public CornerDrawable(Bitmap bmp) {
        this.bmp = bmp;
        BitmapShader shader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//        CLAMP 拉伸
//        REPEAT 重複
//        MIRROR 鏡像
//        BitmapShader是從畫布的左上角開始繪製的
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setShader(shader);
    }

    @Override
    public void draw(Canvas canvas) {
        Rect rect = getBounds();
        // Log.e(getClass().getSimpleName(), rect.left + ":" + rect.width() + ":" + rect.height());
        // Log.e(getClass().getSimpleName(), rectF.left + ":" + rectF.width() + ":" + rectF.height());
        canvas.drawRoundRect(rectF, 20, 20, mPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        mPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    // getIntrinsicWidth、getIntrinsicHeight主要是爲了在View使用wrap_content的時候,提供一下尺寸
    @Override
    public int getIntrinsicHeight() {
        return bmp.getHeight();
    }

    @Override
    public int getIntrinsicWidth() {
        return bmp.getWidth();
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        super.setBounds(left, top, right, bottom);
        rectF = new RectF(left, top, right, bottom);
    }
}

2.除了圓角外,還能夠指定畫圖片的某圓弧對應的內容android

重寫上面的draw方法以下canvas

RectF rf = new RectF(-100, -130, 160, 130);
canvas.drawArc(rf, 0, 120, true, paint);

3.使用PorterDuffXfermodeapp

    @Override
    public void draw(Canvas canvas) {
        PorterDuffXfermode pdf = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
     paint.drawBitmap(dst, 0, 0, paint); paint.setXfermode(pdf); paint.setColor(
0xffff4400); canvas.drawBitmap(src, 0, 0, paint); paint.setXfermode(null); }

http://www.jianshu.com/p/d11892bbe055ide

》》XferModethis

  1. AvoidXfermode  指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)
  2. PixelXorXfermode  當覆蓋已有的顏色時,應用一個簡單的像素異或操做。
  3. PorterDuffXfermode  這是一個很是強大的轉換模式,使用它,可使用圖像合成的16Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。

》》PorterDuff.Mode爲枚舉類,一共有16個枚舉值:spa

  • PorterDuff.Mode.CLEAR    所繪製不會提交到畫布上。
  • PorterDuff.Mode.SRC   顯示上層繪製圖片
  • PorterDuff.Mode.DST  顯示下層繪製圖片
  • PorterDuff.Mode.SRC_OVER  正常繪製顯示,上下層繪製疊蓋。
  • PorterDuff.Mode.DST_OVER  上下層都顯示。下層居上顯示。
  • PorterDuff.Mode.SRC_IN   取兩層繪製交集。顯示上層。
  • PorterDuff.Mode.DST_IN  取兩層繪製交集。顯示下層。
  • PorterDuff.Mode.SRC_OUT 取上層繪製非交集部分。
  • PorterDuff.Mode.DST_OUT 取下層繪製非交集部分。
  • PorterDuff.Mode.SRC_ATOP 取下層非交集部分與上層交集部分
  • PorterDuff.Mode.DST_ATOP 取上層非交集部分與下層交集部分
  • PorterDuff.Mode.XOR  異或:去除兩圖層交集部分
  • PorterDuff.Mode.DARKEN  取兩圖層所有區域,交集部分顏色加深
  • PorterDuff.Mode.LIGHTEN  取兩圖層所有,點亮交集部分顏色
  • PorterDuff.Mode.MULTIPLY  取兩圖層交集部分疊加後顏色
  • PorterDuff.Mode.SCREEN  取兩圖層所有區域,交集部分變爲透明色

參考:ApiDemos/Graphics/XferModescode

 4.對圖片進行顏色轉換orm

    public static Drawable getPrimaryDrawable(int resId) {
        Drawable icon = context.getResources().getDrawable(resId);
        int baseColor = context.getResources().getColor(R.color._secondary_color);
        icon.setColorFilter(baseColor, PorterDuff.Mode.SRC_IN);
        return icon;
    }

5.經過xml定義drawablexml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#ff80cbc4" />
        </shape>
    </item>
    <item android:top="48dp">
        <bitmap
            android:gravity="center"
            android:src="@drawable/app_background_png"
            android:tileMode="disabled" />
    </item>
</layer-list>

6.自定義按鈕狀態

    <declare-styleable name="CustomStateDrawableButton">
        <attr name="state_readed" format="boolean" />
    </declare-styleable>

定義一個狀態

public class CustomStateDrawableButton extends ImageButton {
    public static final int[] MessageReaded = {R.attr.state_readed};
    private boolean isReaded = false;

    public CustomStateDrawableButton(Context context) {
        super(context);
    }

    public CustomStateDrawableButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomStateDrawableButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setReaded(boolean isReaded) {
        if (this.isReaded != isReaded) {
            this.isReaded = isReaded;
            //
            refreshDrawableState();
        }
    }

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        if (!isReaded) {
            int[] ds = super.onCreateDrawableState(extraSpace + 1);
            mergeDrawableStates(ds, MessageReaded);
            return ds;
        }
        return super.onCreateDrawableState(extraSpace);
    }
}
// http://www.devdiv.com/Android-Android%E4%B8%ADDrawable%E5%88%86%E7%B1%BB%E6%B1%87%E6%80%BB%EF%BC%88%E4%B8%8A%EF%BC%89-thread-126853-1-1.html// ColorDrawable、GradientDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、StateListDrawable、TransitionDrawable
相關文章
相關標籤/搜索