开发中遇到美工出的图标是外发光,确实好看,可直接切外发光的图标,效果没有设计图上好,那么只能Android自己实现了.

自定义View
/** * 设置图标外发光 * Created by boyko on 2017/5/11. */public class LightView extends View {    private Paint mPaint;    private Rect mSrcRect;    private Rect mDestRect;    private Bitmap bmp;    private Bitmap shadowBitmap;    private int width;    private int height;    public LightView(Context context) {        super(context);        init(context, null);    }    public LightView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context, attrs);    }    public LightView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context, attrs);    }    private void init(Context context, AttributeSet attrs) {        // 关闭硬件加速        setLayerType(LAYER_TYPE_SOFTWARE, null);        mPaint = new Paint();        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.LightView, 0, 0);        int n = a.getIndexCount();        Drawable src_resource;        for (int i = 0; i < n; i++) {            int attr = a.getIndex(i);            switch (attr) {                case R.styleable.LightView_light_color:                    mPaint.setColor(a.getColor(attr, Color.WHITE));                    break;                case R.styleable.LightView_light_radius:                    mPaint.setMaskFilter(new BlurMaskFilter(a.getFloat(attr, 5f), BlurMaskFilter.Blur.OUTER));                    mPaint.setAlpha(180);   // 可根据实际情况调整                    break;                case R.styleable.LightView_light_src:                    src_resource = a.getDrawable(attr);                    bmp = drawableToBitmap(src_resource);                    break;            }        }    }    @SuppressLint("DrawAllocation")    @TargetApi(Build.VERSION_CODES.KITKAT)    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);       width = this.getMeasuredWidth();        height = this.getMeasuredHeight();        // 获取位图的Alpha通道图        shadowBitmap = Bitmap.createScaledBitmap(bmp.extractAlpha(), width, height, true);        bmp = Bitmap.createScaledBitmap(bmp, width, height, true);        mSrcRect = new Rect(0, 0, shadowBitmap.getWidth(), shadowBitmap.getHeight());        mDestRect = new Rect(0, 0, shadowBitmap.getWidth(), shadowBitmap.getHeight());        canvas.drawBitmap(shadowBitmap, mSrcRect, mDestRect, mPaint);        canvas.drawBitmap(bmp, mSrcRect, mSrcRect, null);    }    public Bitmap drawableToBitmap(Drawable drawable) {        Bitmap bitmap = Bitmap.createBitmap(                drawable.getIntrinsicWidth(),                drawable.getIntrinsicHeight(),                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565);        Canvas canvas = new Canvas(bitmap);        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());        drawable.draw(canvas);        return bitmap;    }    /**     * 重写onMeasure,解决在wrap_content下与match_parent效果一样的问题     * @param widthMeasureSpec     * @param heightMeasureSpec     */    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int height = width;        int width = height;        final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);        final int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);        final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);        final int heightSpecSize = MeasureSpec.getMode(heightMeasureSpec);        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {            setMeasuredDimension(width,height);        }else if (widthSpecMode == MeasureSpec.AT_MOST) {            setMeasuredDimension(width,heightSpecSize);        }else if (heightSpecMode == MeasureSpec.AT_MOST) {            setMeasuredDimension(widthSpecSize,height);        }    }}
所需要的参数
                                   
参数说明:
light_color  外发光的颜色light_radius 外发光的范围(发散程度)light_src    图标(与 imageview 的 src 所填内容一样)
用法 xml
 
效果
无发光效果1
无发光效果2
发光效果1
发光效果2

PS:目前只对图片有效,对 Shape.xml 无效.

更多相关文章

  1. Android多个Activity
  2. android 软件开发错误-解决记录
  3. [Android(安卓)Samples视频系列之ApiDemos] App-Activity-Recrea
  4. Android(安卓)ScrollView反弹效果的实现
  5. Android(安卓)APP安装后不在桌面显示图标的应用场景举例和实现方
  6. context.obtainStyledAttributes 研究
  7. Android之activity跳转并且回调
  8. actionbar 详解教程
  9. android listview滑动设置浮标半透明效果

随机推荐

  1. Android消息处理机制(二)
  2. android sdk+MyEclipse+adt 配置与开发
  3. Android图形显示系统——一张图片的显示
  4. Android 模拟器几个小问题
  5. android 资源之 color
  6. Android(安卓)Studio配置文件路径修改
  7. Android 自动化测试 robotium
  8. Android recovery UI实现分析
  9. Android主流三方库源码分析(七、深入理解B
  10. 从Alarm看Android上层UI到内核代码的流程