安卓踩坑记录之自定义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 用于绘制图形的画布
     */
    @Override
    public 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
     */
    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
        invalidateSelf();  //调用了此方法之后,会使得重新绘制Drawable
    }

    /**
     * 设置颜色过滤,同样用画笔来实现,这个呢我还没有接触过,就不作说明了
     * @param colorFilter
     */
    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
        invalidateSelf();
    }

	// Must be PixelFormat.UNKNOWN, TRANSLUCENT, TRANSPARENT, or OPAQUE
    @Override
    public 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" />
发布了61 篇原创文章 · 获赞 89 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tran_sient/article/details/104633675
今日推荐