1.使用BitmapShader实现图片圆角

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.除了圆角外,还可以指定画图片的某圆弧对应的内容

重写上面的draw方法如下

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

3.使用PorterDuffXfermode

    @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/d11892bbe055

》》XferMode

  1. AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
  2. PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素异或操作。
  3. PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

》》PorterDuff.Mode为枚举类,一共有16个枚举值:

  • 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/XferModes

4.对图片进行颜色转换

    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定义drawable

<?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

Android 自定义Drawable的更多相关文章

  1. Android自定义drawable(Shape)详解

    在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片. 这样就容易使apk变大. 那 ...

  2. Android APK开发 Drawable文件夹下的自定义Drawable文件

    版本:2018/2/11 Drawable的分类 自定义Drawable SVG矢量图 个人总结的知识点外,部分知识点选自<Android开发艺术探索>-第六章 Drawable 1.Dr ...

  3. Android 使用自定义Drawable 设置圆角矩形或者圆形图片

    转自  Android Drawable 那些不为人知的高效用法 本文出自:[张鸿洋的博客] http://blog.csdn.net/lmj623565791/article/details/437 ...

  4. Android—自定义开关按钮实现

    我们在应用中经常看到一些选择开关状态的配置文件,做项目的时候用的是android的Switch控件,但是感觉好丑的样子………… 个人认为还是自定义的比较好,先上个效果图:

  5. android 自定义通知栏

    package com.example.mvp; import cn.ljuns.temperature.view.TemperatureView;import presenter.ILoginPre ...

  6. 最简单的android自定义进度条样式

    一.自定义圆形进度条样式 1.在安卓项目drawable目录下新建一个xml文件如下:<?xml version="1.0" encoding="utf-8&quo ...

  7. Android自定义spinner下拉框实现的实现

    一:前言 本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去 ...

  8. Android自定义对话框

    在android中有自带的对话框,为了美观,很多开发者会使用自定义对话框,如下图: 点击“弹出自定义对话框按钮后”显示如图效果. 首先要自己定义一个xml文件定义自己对话框的样式: <?xml ...

  9. android 自定义Style初探---ProgressBar

    系统自带的ProgressBar太丑了,所以我决定自定义一个Style. 原来的Style <?xml version="1.0" encoding="utf-8& ...

随机推荐

  1. Linux:环境变量

    环境变量 变量 变量定义:declare tmp,declare是可选的. 变量赋值:tmp=1,=号左右不要有空格. 变量引用:echo $tmp,不要忘记了$号. 环境变量 简单理解了变量的概念, ...

  2. 用dom操作替代正则表达式

    在B/S结构客户端越来越“胖”的今天,作为一名全端程序员,您很可能会在前端操作html字符串,注意,是操作html字符串,不是操作当前页面的html. 举个例子,百度推出的在线HTML富文本编辑器Ue ...

  3. C++ 模板与泛型编程

    <C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存 ...

  4. nosql/nodejs基础

    nosql定义:nosql--no only sql 目前流行的非关系型数据库:mongodb,redis,cassandra 非关系型数据库和内存存储hashmap数据结构有什么区别?hashmap ...

  5. Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc

    Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc 1. #-------常用 游戏类型 1 2. 街机的历史 2 3. #=========== ...

  6. 理解Certificate、App Id、Identifiers 和 Provisioning Profile

    做真机测试的时候,按照网上的流程,走通了,当时没有注意各种证书等的意思.现在做消息推送,需要各种证书.APP ID信息,为了更好的理解这个过程,所以整理了网上关于证书等的相关资料.方便自己和有需要的朋 ...

  7. 雅虎Yahoo 前段优化 14条军规

    Yahoo 14条 雅虎十四条 腾讯前端设计的Leader推荐我背熟的.请大家都能好好学习,不要像我一样一扫而过,好好的记下来!不仅仅是晓得一些CSS xhtml就好了,深刻认识到很多的东西需要学习的 ...

  8. UWP开发-二维变换以及三维变换

    在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在UWP中这些变换的实现方法. 一. 二维变换: UIElement.RenderTransform a.Trans ...

  9. 2014 Hangjs 见闻流水账第一天

    前言 6月21日~6月22日, 第一次跑远门去参加一个大会(广州 -> 杭州),本来打算,在火车的回来的路上,把这两天的东西记录一下,不过,火车上的环境实在恶劣,同时也高估了自己的专注力,所以, ...

  10. PreparedStatement ResultSet

    public int searchProblemDistinctCount() throws Exception { DBOperator dbo = getDBOperator(); try { P ...