引言:
只有不断地尝试,不断地摸索,不断地学习,不断地努力,你才能知道原来自己是真的菜,啊哈哈哈哈哈。但是菜归菜,多踩些坑其实是好事,踩一个少一个嘛。博主今天又解决了一个坑,就是之前写过一个自定义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不显示的问题相关推荐

  1. Vue路由history模式踩坑记录:nginx配置解决404问题

    问题背景: vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想hash这种以#号结尾的路径时候的话,我们可以使 ...

  2. 【ShaderLab踩坑记录】【待解决 / 求助】给AlphaTest添加阴影导致的奇奇怪怪的Bug

    庄懂的技术美术入门课(美术向)-直播录屏-第12课 偶然看到了庄懂老师的公开课,下载了工程,跟着做了一个第12节课的DOTA2角色shader,结果遇到了一个动用我全身上下的脑子(bushi)也想不清 ...

  3. 安卓 Native+Flutter 应用开发入门资料、亲身实战及踩坑记录

    安卓 Native+Flutter 应用开发实战及踩坑记录,练手入门项目:FluLearn 入门资料 第三方共享包检索(国内).第三方共享包检索(国外) Flutter开发环境搭建(中文版).Flut ...

  4. 安卓qpythonttsspeak_安卓语音合成助手TextToSpeech的使用踩坑记录

    安卓语音合成助手TextToSpeech的使用踩坑记录 由于软件中需要播放一些语音,最初的时候都是用一些电脑上的语音生成器生成一些wav音频文件,然后让程序播放,但是这种方法着实不太优雅,所以就开始想 ...

  5. 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录

    使用ByteArrayOutputStream解决IO乱码问题的踩坑记录 参考文章: (1)使用ByteArrayOutputStream解决IO乱码问题的踩坑记录 (2)https://www.cn ...

  6. vue项目中将视频链接分享至推特的解决方法及踩坑记录

    vue项目中将视频链接分享至推特的解决方法及踩坑记录 将动态改变的视频链接分享至推特,并希望能直接在推特上播放视频的需求实现方法及踩坑记录 如果只要将文本或链接分享到推特,不需要推特识别图片/视频等媒 ...

  7. 【踩坑记录】实体机器人运行Cartographer 3D Slam(深度摄像头)--未解决

    [运行背景] ROS1.0  20.04 noetic 机器人:NXRobo SPARK-T 安装cartographer请看: [安装学习]安装Cartographer ROS(noetic)_Ho ...

  8. 日常踩坑记录-汇总版

    开发踩坑记录,不定时更新 心得 RTFM 严谨的去思考问题,处理问题 严格要求自己的代码编写习惯与风格 注意 单词拼写 20200207 mybatis plus 自带insert插入异常 sql i ...

  9. ClickOnce踩坑记录

    这里写自定义目录标题 ClickOnce踩坑记录 开发环境: 发布时异常: 安装时异常 ClickOnce踩坑记录 开发环境: win10+vs2019+.net 4.5.2 发布时异常: ERROR ...

最新文章

  1. 有汇编功能的python编译器_7.12 计算机基础理念与python解释器编译器安装使用
  2. 【项目经验】在填写表单时,首先添加一个失去焦点事件,将数据库中信息自动填充信息到表单,其余信息手动填写然后提交表单。
  3. 【线上分享】基于AI的超分辨技术在RTC领域的技术难点与挑战
  4. android界面实现框架内页面跳转_KVM虚拟化管理平台的实现
  5. idle显示出错信息 python_原来学Python最好的书是这一本?它在bookauthority里排名第三...
  6. 区分那些是属于构架方面的C++功能
  7. 信息学奥赛一本通(1153:绝对素数)
  8. 我就是那个一直拿着死工资的人
  9. featuretools,可自动构造机器学习特征的Python库
  10. 01-vue项目之滚动加载数据
  11. Oracle数据库练习题(3)
  12. 在 Activity 中添加 Menu 菜单
  13. 梦幻西游鸿蒙石之鉴如何捡碎片,梦幻西游鸿蒙石之鉴任务攻略 鸿蒙石之鉴攻略...
  14. GTX1050 Ti(notebooks)+Ubuntu16.04上安装Cuda8.0
  15. UE4 C++与UMG
  16. 轻运维|无人干预,易捷行云新一代私有云一键式扩容
  17. OFD文件怎么转换成图片?这两种方法能够快速转换
  18. 利用“bert模型”预测英语“完形填空”答案
  19. 微信小程序-提交表单成功弹窗提示
  20. layui table动态选中_mac动态图片编辑工具-Motion

热门文章

  1. 计算机管理员账户停用,win7管理员账户被停用了怎么办
  2. 电脑城的衰退:时代的进步还是文化的消失?
  3. thinkpad SL500 2746ca1 安装lion iatkos L2 64bit 成功
  4. Java中的流式编程
  5. 记一次台式机显示器闪屏问题解决
  6. ZeroMemory函数的使用及注意事项
  7. understand 二:understand使用教程
  8. Windows: net和shutdown命令重启远程电脑
  9. 企业仓库盘点该怎么做?
  10. 【Maths】指数运算 exponential