Android(安卓)图标外发光
16lz
2021-01-25
开发中遇到美工出的图标是外发光,确实好看,可直接切外发光的图标,效果没有设计图上好,那么只能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 无效.
更多相关文章
- Android多个Activity
- android 软件开发错误-解决记录
- [Android(安卓)Samples视频系列之ApiDemos] App-Activity-Recrea
- Android(安卓)ScrollView反弹效果的实现
- Android(安卓)APP安装后不在桌面显示图标的应用场景举例和实现方
- context.obtainStyledAttributes 研究
- Android之activity跳转并且回调
- actionbar 详解教程
- android listview滑动设置浮标半透明效果