android 使用BitmapShader实现圆形以及放大镜效果

2023-11-08

在一些显示用户头像的时候,大多数都是显示圆形的,而不是显示一个正方形或者长方形,这样显得很呆板,视觉效果也不好看,今天就用二种方式实现图片圆形显示的效果,在先讲这个效果实现之前,讲下BitmapShader到底能干嘛,android有几个关于渲染的类,使用它能实现一些不错的效果,比如今天讲的BitmapShader的就是关于图像渲染,还有其他4种,这都会再以后都会以博客的形式写出来,今天就单独讲讲BitmapShader,进入BitmapShader源码发现这是你见过最简单的系统类源码了

package android.graphics;

public class BitmapShader extends android.graphics.Shader {
    public BitmapShader(android.graphics.Bitmap bitmap, android.graphics.Shader.TileMode tileX, android.graphics.Shader.TileMode tileY) { /* compiled code */ }
}
这构造函数中就三个参数,简单说明下:

第一个bitmap:就是你渲染图像对象

第二个参数tileX:就是你x轴方向渲染模式

第三个参数tileY:就是你y轴方向渲染模式

关于渲染模式有三种:

从上面的代码中知道BitmapShader是继承了Shader类,而模式就是定义在Shader中的一个枚举而已

package android.graphics;

public class Shader {
    public Shader() { /* compiled code */ }

    public boolean getLocalMatrix(android.graphics.Matrix localM) { /* compiled code */ }

    public void setLocalMatrix(android.graphics.Matrix localM) { /* compiled code */ }

    protected void finalize() throws java.lang.Throwable { /* compiled code */ }

    public static enum TileMode {
        CLAMP, MIRROR, REPEAT;

        private TileMode() { /* compiled code */ }
    }
}
从代码中我们就清晰的看到定义的TileMode有三种

CLAMP:当view控件宽或者高大于你渲染图形的大小时,拉伸最后一个像素去铺满剩下的地方

MIRROR:当view控件宽或者高大于你渲染图形的大小时,通过镜像翻转铺满剩下的地方

REPEAT:当view控件宽或者高大于你渲染图形的大小时,重复图片平铺整个画面(电脑设置壁纸)

等下会说这个三个模式,先把第一种实现圆形的方式代码贴下:

package com.bitmapshaderdemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
 * Created by admin on 2016/11/22.
 */
public class RoundHeadView extends View {
    private static final String TAG ="RoundHeadView" ;
    private Paint mPaint;
    private ShapeDrawable shapeDrawable;
    private BitmapShader bitmapShaderp;
    public RoundHeadView(Context context) {
        this(context,null);
    }
    public RoundHeadView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public RoundHeadView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
        init();
        setBackgroundColor(Color.RED);
    }
    private void init() {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.gird);
        Log.e(TAG,"-"+bitmap.getWidth()+"-"+""+bitmap.getHeight());
        shapeDrawable = new ShapeDrawable(new OvalShape());
        bitmapShaderp = new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
        shapeDrawable.getPaint().setShader(bitmapShaderp);
    }
    private void initPaint() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        shapeDrawable.draw(canvas);
    }
}
运行起来看效果:


发现屏幕一片空白,这是为什么呢? 是因为你没给图片显示设置位置,哪可能会说我我这个自定义view的宽和高就是屏幕的宽和高,但是你必须要给shapeDrawable设置显示区域,

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    shapeDrawable.setBounds(200,200,400,400);
    shapeDrawable.draw(canvas);
}
我们在onDraw()方法中指定了显示的区域,就是一个矩形区域,现在运行看效果


ok,一个美女头像出来了,这是一种实现方式,下面不使用ShapeDrawable再实现下:

package com.bitmapshaderdemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 使用BitmapShader实现圆形以及放大镜效果 的相关文章

  • ASP.NET 自定义控件 自定义属性的使用

    最近在给公司一个老的ASP平台进行改版 xff0c 由于这个平台运行时间太长 xff0c 期间有很多程序员进行过修改 xff0c 导致数据库显得很乱 在实际改版时架构采用了多层架构 xff0c 引入工厂模式 xff0c 面向接口 对于资讯类
  • 自定义控件-UIControl

    UIControl是控件的基类 xff0c 例如 xff1a 按钮 xff0c 滑块等将用户的目的传递到应用程序中 UIContol不能直接的实例化 xff0c 它只能通过继承的方式为子类提供公共的接口和动作结构 UIControl的主要角
  • C#自定义控件

    一 开发环境和工具 1 WIN10系统 2 Visual Studio社区版 2019 xff08 C xff09 二 创建自定义控件窗体 添加一个自定义控件 xff0c 右键解决方案 xff0c 点击添加 xff0c 然后点击用户控件 选
  • 自定义控件sizechange问题

    自定义一个控件的时候 xff0c 放在容器里面 xff0c 显示后 xff0c 容器大小怎么改变没有异常 xff0c 但是如果把一个自定义控件放到另一个自定义控件的时候 xff0c 就有这样的问题 xff0c 就是自定义控件2成为了自定义控
  • ASP.NET 自定义控件 自定义属性的使用

    最近在给公司一个老的ASP平台进行改版 xff0c 由于这个平台运行时间太长 xff0c 期间有很多程序员进行过修改 xff0c 导致数据库显得很乱 在实际改版时架构采用了多层架构 xff0c 引入工厂模式 xff0c 面向接口 对于资讯类
  • android 学习中遇到的知识点(杂)

    1 用xml 合成图片 ic launcher xml 作用 将两个图片组合成一个图片 一个背景图 一个icon
  • WaterView 自定义圆形水波进度

    这几天不是很忙 完成了工作 利用闲暇的时间来完成一下以前不会玩的自定义动画 自定义圆形水波进度 这个以前把我难死了 死活不会 都怪自己太菜了 那么现在来看看到底难不难 真正最简单的实现方法 先来了解下path类的基本方法 移动起点 move
  • C#贝塞尔曲线的应用-未读红点拖拽粘连效果

    前言 提示 仿照手机qq未读红点拖拽粘连效果 贝塞尔曲线的应用非常广泛 本篇文章将使用Winform贝塞尔曲线来实现QQ未读红点拖拽粘连的效果 手机QQ粘连效果 最终实现的效果 分析效果 1 可以看出随着拖拽的距离变大 固定点的圆会逐渐变小
  • TextView自动适配文本大小的几种方案

    标题太难取了 其实本文主要就是讲如何控制文本大小 让其自动适配宽度 其次我们还需要精准控制Text的高度和宽度间距等属性 一般我们的布局都是分 match parent 和 wrap content 而他们的自动方式又有所不同 下面看看都有
  • Android自定义控件:imageview重写onMeasure方法实现图片按指定比例显示,拉伸永不变形,解决屏幕适配问题

    使用ImageView会遇到的问题 在Android应用中 都少不了图片的显示 ImageView 轮播图 ViewPager等等 很多都是来显示图片的 比如一个广告条的轮播效果 参看博客 广告条效果实现 ViewPager加载大图片 Lr
  • QT自定义Tab标签页,可以删除、添加、修改和选中

    先看效果 部分源码 pragma once include
  • Android studio中Custom View使用方法

    Android studio的好处 这里就不错过多的说明了 studio中内置了很多的模版可供使用 大大的简化了工作量 在实际开发中 android自带的各类控件可能无法满足我们的需求 这就需要我们自定义控件 下面介绍一下Custom Vi
  • WPF 使用自定义控件(custom control),资源字典(ResourceDictionary),用户控件(user control),及之间的对比

    最近使用WPF比较多 过来记录一下 对比一下 个人理解usercontrol比较适用于组合控件 比如你想要实现的控件是由多个控件组成的 customCcontrol主要是用来单独重绘控件 如button datagrid lable等 cu
  • android 使用BitmapShader实现圆形以及放大镜效果

    在一些显示用户头像的时候 大多数都是显示圆形的 而不是显示一个正方形或者长方形 这样显得很呆板 视觉效果也不好看 今天就用二种方式实现图片圆形显示的效果 在先讲这个效果实现之前 讲下BitmapShader到底能干嘛 android有几个关
  • 关于app退出的问题,完美退出方式

    实际开发中会有很多关于app的退出问题 我个人比较常见的有两种 一 双击退出 比如说我们在首页的时候需要一个双击退出的方法 点击第一次手机的返回键时提示 再点一次退出应用 之类的话语 我们可以这样做 对重写onKeyDown方法 当他第一次
  • C# 自定义Label实现 指定字符串(关键词)高亮显示(字体、颜色)

    C 自定义Label实现 指定字符串 关键词 高亮显示 字体 颜色 原来是搞android的 本来自己就菜 现在由于项目需要开始着手弄C WPF 虽然了解一些 毕竟只是皮毛 唉 苦不堪言啊 还是得倚靠万能的互联网啊 需求 提示用户的文字 但
  • 自定义控件中 wrap_content 属性无效的分析解决

    问题 在自定义一个类似锁屏页面时间日期样式的控件 继承 View 的时候 发现在 xml 中使用 wrap content 属性相当于使用了 match parent 属性 原因分析 进入View的源码 可以看到 onMeasure 的方法
  • Android实现裁剪

    Android自定义View实现图片缩放旋转移动裁剪 灰信网 软件开发博客聚合 freesion com SuppressLint AppCompatCustomView public class CorpToView extends Im
  • C#System.ArgumentException

    C 自定义控件GDI绘制在主程序报错System ArgumentException 我的绘制图片内容大概如下 private Bitmap backGroundImage null private Bitmap prospectImage
  • Qt自定义图片按钮并设置方向

    Qt自定义图片按钮 设置方向 虽然Qt定义了很多很多控件 但是还是不能满足用户的需要 比如如果想使用ToolButton 需要带文字 又需要文字可以设定位置 显然就不行了 下面的代码就是一个简单的实现ToolButton功能 并且能够设置图

随机推荐

  • Fisco Bcos学习(环境搭建)

    服务器搭建联盟链过程 一 docker方式部署单群组4节点区块链 1 安装依赖 1 安装curl openssl yum install y curl openssl openssl devel 2 下载安装脚本 curl LO https
  • 完美解决 vcpkg 下载速度慢

    vcpkg 下载慢非常令人头痛 下面是一位 github 用户的抱怨 非常真实 The download and compilation time of vcpkg is relatively long So during this wai
  • 人才画像--持续更新

    人力资源管理包括人力资源规划 招聘与配置 培训与开发 绩效管理 薪酬管理及员工关系 六大模块 六大模块之间相辅相成 相互联系 对解决企业人才的 留 选 育 用 问题具有极为关键的作用 大数据时代的到来 为其注入了新能量 有人认为 大数据将成
  • 【面试题】2、Docker和Spring相关

    1 Docker是什么 1 Docker是一个快速交互 运行应用的技术 可以将程序及其依赖 运行环境一起打包为一个镜像 该镜像可以迁移到任意的Linux操作系统 2 运行时利用沙箱机制形成隔离容器 各个应用之间互不干扰 3 移动和移除程序都
  • Oracle的三种高可用集群方案

    转载自 http www cnblogs com baiboy p orc2 html label1 Oracle的三种高可用集群方案 1 RAC Real Application Clusters 多个Oracle服务器组成一个共享的Ca
  • matlab 奇异值分解

    1 奇异值分解 关于matlab中的diag函数 矩阵对角元素的提取和创建对角阵
  • CPT104 习题笔记

    调度算法 时间 突发时间 Burst time 通常 我们忽略I O时间 只考虑进程的CPU时间 因此 突发时间是进程在CPU上执行所花费的总时间 Arrival Time 到达时间是流程进入就绪状态并为其执行做好准备的时间 Exit ti
  • Spring属性占位符PropertyPlaceholderConfigurer的使用

    Spring属性占位符PropertyPlaceholderConfigurer的使用 1 一个简单的Demo 1 1 创建conf xml
  • git clone remote: HTTP Basic: Access denied问题解决

    今天用git下载项目 突然提示 查阅资料才发现是因为最近更改gitlab密码的缘故 进入控制面板如下目录 修改对应的git普通凭据 问题解决
  • 华为这么容易进吗?轻轻松松拿到25K的offer...

    美本计算机专业 代码能力一般 之前有过两段实习以及一个学校项目经历 本人面试的是测试开发岗 期间经历了笔试 gt 性格测试 gt 技术一面 gt 技术二面 gt 总监面 gt OC这几个环节 基本上每周完成一个环节 由于华为面试环节全部完成
  • 实战分享:I2C总线详解

    大家好 我是阿荣 感恩遇见 本文部分图文来源于网络 并经过整合 编辑和勘误 实战分享栏目将重点介绍嵌入式的基础知识 并融合一些实战经验 持续勘误和迭代 建议关注和收藏 WX同名 I2C总线是一种常用的通信接口 让我们先来看看百度百科对它的定
  • 微信小程序 - 暗黑模式(深色模式)

    最近暗黑模式成为了潮流 微信小程序也推出了暗黑模式适配 下面来记录一个下适配暗黑模式 效果图 一 实现 1 开启暗黑模式 在 app json 中配置 darkmode true app json darkmode true 2 配置主题文
  • Linux 下 C语言编写 TCP/IP文件传输

    一 概述 文件传输 分为文件名字和文件内容 传递文件名后 等待另外一端创建相应的文件并回复 然后在开始传输文件内容 以下程序还设计到目录的查询 二 目录的查询 主要头文件 include
  • Android Studio 安装 (MAC)

    一 下载地址 Download Android Studio App Tools Android Developers 二 安装配置 1 Do not import settings 2 Cancel gt Next 3 Standard
  • 极限验证,滑动验证-java实现

    先给大家看个图 图中共色框内的验证码 大家应该见过 今天咱们就实现这个插件 其实这个插件是第三方服务的 极限验证码 官网 http www geetest com 官网有文档还有教程 大家可以自己看 我也是运行官方的源码 1 在官网 htt
  • JS中断循环

    js中断循环 中断循环 for var i 1 i lt 200 i if i 7 0 break 中断循环 document write i t 中断一次循环 继续下面的循环 for var i 1 i lt 100 i if i 3 0
  • 计算机投影仪显示无信号如何解决,投影仪无信号输入的解决办法是什么?

    Lin 4987 2015 11 05 13 27 笔记本电脑连接投影仪无信号 1 检查投影机与电脑连接使用的是VGA线还是HDMI线 2 如果是VGA连接 请检查投影机是否选择到VGA或者电脑模式 如果是HDMI连接的话 请检查投影机是否
  • ECCV 2016《SSD: Single Shot MultiBox Detector》论文笔记

    本学弱喜欢在本子上记笔记 但字迹又丑 望看不懂我的字的大佬不要喷我 看得懂的大佬批评指正
  • HCIA Datacom_DHCP基础与原理、常见的网络服务与应用、PPPoE原理与配置

    DHCP基础与原理 一 应用场景 DHCP服务器能够为大量主机分配IP地址 并能够集中管理 DHCP用来自动分配IP地址 在DHCP中有两个角色 DHCP客户端 DHCP服务器 DHCP是一种类型的C S架构 二 报文类型 1 DHCP D
  • android 使用BitmapShader实现圆形以及放大镜效果

    在一些显示用户头像的时候 大多数都是显示圆形的 而不是显示一个正方形或者长方形 这样显得很呆板 视觉效果也不好看 今天就用二种方式实现图片圆形显示的效果 在先讲这个效果实现之前 讲下BitmapShader到底能干嘛 android有几个关