安卓踩坑记录之自定义Drawable - 解决自定义Drawable不显示的问题
引言:
只有不断地尝试,不断地摸索,不断地学习,不断地努力,你才能知道原来自己是真的菜,啊哈哈哈哈哈。但是菜归菜,多踩些坑其实是好事,踩一个少一个嘛。博主今天又解决了一个坑,就是之前写过一个自定义Drawable的test,但是运行起来之后却是一片空白,我找了许久,跟官方文档的例子比对了无数次,毕竟第一次见自定义的Drawable,害怕自己写错,最后还是没有找到不一样的地方。相信大家都经历过这种绝望,我明明跟他写的一模一样,为什么运行不出来啊…emmm。
原因:
原来是因为ImageView的布局,我将宽高设为了wrap_content,我的天,这真的是只有实践了才知道啊。解决办法就很简单了噻,设置为具体数值或使它具有一个初始大小,比如match_parent即可解决。好了,既然说到了自定义Drawable,那就来说说什么是自定义Drawable吧!!!
自定义Drawable:
如果您想创建一些自定义可绘制对象,可以通过扩展 Drawable 类(或其任何子类)来实现。
要实现的最重要方法是 draw(Canvas),因为它提供了您在提供绘制指令时必须使用的 Canvas 对象。
代码如下:
package com.example.mydrawabletest.widghts;import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.print.PrinterId;
import android.util.Log;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;/*** 之前不管我怎么操作,Drawable就是显示不到ImageView上* 然后今天偶然发现自己踩到了坑点* 原因是ImageView的大小设置为了wrap_content:* 1.导致getBounds()方法获取的宽高不正常,我这里总是为1* 2.即使不调用getBounds(),ImageView的大小设置为了wrap_content依然会使得Drawable无法显示* 现在我的ImageView属性为match_parent*/public class MyDrawable extends Drawable {//构造一个画笔对象private Paint mPaint;public MyDrawable() {mPaint=new Paint(Paint.ANTI_ALIAS_FLAG); //设置抗锯齿效果mPaint.setARGB(255,255,0,0);mPaint.setStyle(Paint.Style.FILL);mPaint.setStrokeWidth(2.5f);}/*** 此方法是自定义Drawable的核心方法* @param canvas 用于绘制图形的画布*/@Overridepublic void draw(@NonNull Canvas canvas) {int width=getBounds().width();int height=getBounds().height();float radius=Math.min(width,height)/2;Log.w("tag",""+width+" "+height+" "+radius);canvas.drawCircle(width/2,height/2,radius,mPaint);}/*** 可以在此处设置透明度,其实内部实现是设置了画笔的透明度* 设置后,重新绘制Drawable* @param alpha*/@Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);invalidateSelf(); //调用了此方法之后,会使得重新绘制Drawable}/*** 设置颜色过滤,同样用画笔来实现,这个呢我还没有接触过,就不作说明了* @param colorFilter*/@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {mPaint.setColorFilter(colorFilter);invalidateSelf();}// Must be PixelFormat.UNKNOWN, TRANSLUCENT, TRANSPARENT, or OPAQUE@Overridepublic int getOpacity() {return PixelFormat.TRANSPARENT;}
}
然后,您可以将可绘制对象添加到任意位置;例如添加到 ImageView:
mMyDrawable=new MyDrawable();mImageView.setImageDrawable(mMyDrawable);
效果图:
在 Android 7.0(API 级别 24)及更高版本上,您还可以使用 XML 定义自定义可绘制对象的实例,方法如下:
1.将完全限定类名用作 XML 元素名称,对于这种方法,自定义可绘制类必须是顶级公开类:
<com.myapp.MyDrawable xmlns:android="http://schemas.android.com/apk/res/android"android:color="#ffff0000" />
2.将 drawable 用作 XML 标记名称,并通过类属性指定完全限定的类名称。此方法可同时用于顶级公开类和公开静态内部类:
<drawable xmlns:android="http://schemas.android.com/apk/res/android"class="com.myapp.MyTopLevelClass$MyDrawable"android:color="#ffff0000" />
安卓踩坑记录之自定义Drawable - 解决自定义Drawable不显示的问题相关推荐
- Vue路由history模式踩坑记录:nginx配置解决404问题
问题背景: vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想hash这种以#号结尾的路径时候的话,我们可以使 ...
- 【ShaderLab踩坑记录】【待解决 / 求助】给AlphaTest添加阴影导致的奇奇怪怪的Bug
庄懂的技术美术入门课(美术向)-直播录屏-第12课 偶然看到了庄懂老师的公开课,下载了工程,跟着做了一个第12节课的DOTA2角色shader,结果遇到了一个动用我全身上下的脑子(bushi)也想不清 ...
- 安卓 Native+Flutter 应用开发入门资料、亲身实战及踩坑记录
安卓 Native+Flutter 应用开发实战及踩坑记录,练手入门项目:FluLearn 入门资料 第三方共享包检索(国内).第三方共享包检索(国外) Flutter开发环境搭建(中文版).Flut ...
- 安卓qpythonttsspeak_安卓语音合成助手TextToSpeech的使用踩坑记录
安卓语音合成助手TextToSpeech的使用踩坑记录 由于软件中需要播放一些语音,最初的时候都是用一些电脑上的语音生成器生成一些wav音频文件,然后让程序播放,但是这种方法着实不太优雅,所以就开始想 ...
- 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录
使用ByteArrayOutputStream解决IO乱码问题的踩坑记录 参考文章: (1)使用ByteArrayOutputStream解决IO乱码问题的踩坑记录 (2)https://www.cn ...
- vue项目中将视频链接分享至推特的解决方法及踩坑记录
vue项目中将视频链接分享至推特的解决方法及踩坑记录 将动态改变的视频链接分享至推特,并希望能直接在推特上播放视频的需求实现方法及踩坑记录 如果只要将文本或链接分享到推特,不需要推特识别图片/视频等媒 ...
- 【踩坑记录】实体机器人运行Cartographer 3D Slam(深度摄像头)--未解决
[运行背景] ROS1.0 20.04 noetic 机器人:NXRobo SPARK-T 安装cartographer请看: [安装学习]安装Cartographer ROS(noetic)_Ho ...
- 日常踩坑记录-汇总版
开发踩坑记录,不定时更新 心得 RTFM 严谨的去思考问题,处理问题 严格要求自己的代码编写习惯与风格 注意 单词拼写 20200207 mybatis plus 自带insert插入异常 sql i ...
- ClickOnce踩坑记录
这里写自定义目录标题 ClickOnce踩坑记录 开发环境: 发布时异常: 安装时异常 ClickOnce踩坑记录 开发环境: win10+vs2019+.net 4.5.2 发布时异常: ERROR ...
最新文章
- 有汇编功能的python编译器_7.12 计算机基础理念与python解释器编译器安装使用
- 【项目经验】在填写表单时,首先添加一个失去焦点事件,将数据库中信息自动填充信息到表单,其余信息手动填写然后提交表单。
- 【线上分享】基于AI的超分辨技术在RTC领域的技术难点与挑战
- android界面实现框架内页面跳转_KVM虚拟化管理平台的实现
- idle显示出错信息 python_原来学Python最好的书是这一本?它在bookauthority里排名第三...
- 区分那些是属于构架方面的C++功能
- 信息学奥赛一本通(1153:绝对素数)
- 我就是那个一直拿着死工资的人
- featuretools,可自动构造机器学习特征的Python库
- 01-vue项目之滚动加载数据
- Oracle数据库练习题(3)
- 在 Activity 中添加 Menu 菜单
- 梦幻西游鸿蒙石之鉴如何捡碎片,梦幻西游鸿蒙石之鉴任务攻略 鸿蒙石之鉴攻略...
- GTX1050 Ti(notebooks)+Ubuntu16.04上安装Cuda8.0
- UE4 C++与UMG
- 轻运维|无人干预,易捷行云新一代私有云一键式扩容
- OFD文件怎么转换成图片?这两种方法能够快速转换
- 利用“bert模型”预测英语“完形填空”答案
- 微信小程序-提交表单成功弹窗提示
- layui table动态选中_mac动态图片编辑工具-Motion