【Android动画渲染及混合模式】

2023-11-02

Android动画渲染及混合模式

public class GradientLayout extends View {

private Paint mPaint;
private Shader mShader;
private Bitmap mBitmap;

public GradientLayout(Context context) {
    this(context,null);
}

public GradientLayout(Context context, AttributeSet attrs) {
    this(context,attrs,0);
}

public GradientLayout(Context context,AttributeSet attrs,int defStyleAttr) {
    super(context,attrs,defStyleAttr);
    init();
}

private void init(){

    mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.idea);

mPaint = new Paint();//初始化

// mPaint.setColor(Color.RED);
// mPaint.setARGB(255,255,255,0);//设置Paint对象颜色。,范围为0~255
// mPaint.setAlpha(200);//设置alpha不透明度,范围为0~255
mPaint.setAntiAlias(true);//抗锯齿
//
mPaint.setStyle(Paint.Style.FILL);//描边效果
// mPaint.setStrokeWidth(4);//描边宽度
//
// mPaint.setStrokeCap(Paint.Cap.ROUND);//圆角效果
// mPaint.setStrokeJoin(Paint.Join.MITER);//拐角风格
// mPaint.setShader(new SweepGradient(200,200,Color.BLUE,Color.RED));//设置环形渲染器
// mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));//设置图层混合模式
// mPaint.setColorFilter(new LightingColorFilter(0x00ffff,0x000000));//设置颜色过滤器
// mPaint.setFilterBitmap(true);//设置双线性过滤
// mPaint.setMaskFilter(new BlurMaskFilter(10,BlurMaskFilter.Blur.NORMAL));//设置画笔遮罩滤镜,传入度数和样式
// mPaint.setTextSize(38);
// mPaint.setTextScaleX(2);//设置文本缩放倍数
// mPaint.setTextAlign(Paint.Align.LEFT);//对其方式
// mPaint.setUnderlineText(true);//设置下划线
//
// String str = “xxxxx”;
// Rect rect = new Rect();
// mPaint.getTextBounds(str,0,str.length(),rect);//测量文本大小,将文本大小信息存放在rect中
// mPaint.measureText(str);//获取文本的宽
// mPaint.getFontMetrics();//获取字体度量对象

}

@Override
protected  void onDraw(Canvas canvas){
    super.onDraw(canvas);

// /**

// * 1.线性渲染,LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[], @Nullable float positions[],@)

// * colors:渐变数组
// * positions:位置数组,position的取值范围[0,1],作用是指定某个位置的颜色值,如果传null,渐变就线性变化
// * tile:用于指定控件区域大于指定的渐变区域时,空白区域的颜色填充方法
// */
// // mShader = new LinearGradient(0,0,500,500,new int[]{Color.RED,Color.BLUE},null, Shader.TileMode.CLAMP);
//
// mShader = new LinearGradient(0,0,500,500,new int[]{Color.RED,Color.BLUE,Color.GREEN},new float[]{0.f,0.7f,1},Shader.TileMode.CLAMP);
// mPaint.setShader(mShader);
canvas.drawCircle(250,250,250,mPaint);
// canvas.drawRect(0,0,500,500,mPaint);

// /**

// * 环形渲染:RadialGradient(float centerX, float centerY, float radious, @ColorInt int colors[], @Nullable float stops[], TileMode)

// * centerX,centerY:shader的中心坐标,开始渐变的坐标;
// * radius:渐变的半径;
// * centerColor,edgeColor:中心点渐变颜色,边界渐变颜色;
// * colors:渐变颜色数组;
// * stoops:渐变位置数组,类似扫描渐变的positions数组,取值[0,1],中心点为0,半径到达位置为1.0f;
// * tileMode:shader未覆盖以外的填充模式;
// */
// mShader = new RadialGradient(250,250,250,new int[]{Color.GREEN,Color.YELLOW,Color.RED},null,Shader.TileMode.CLAMP);
// mPaint.setShader(mShader);
// canvas.drawCircle(250,250,250,mPaint);

// /**

// * 扫描渲染:SweepGradient(float cx, float cy, int color0, int color1) // * 参数:

// * cx cy:扫描的中心;
// * color0:扫描的起始颜色;
// * color1:扫描的终止颜色;
// * colors,positions:类似LinearGradient,用于颜色渐变,positions为null时,根据颜色线性渐变;
// */
// mShader = new SweepGradient(250,250,Color.RED,Color.GREEN);
// mPaint.setShader(mShader);
// canvas.drawCircle(250,250,250,mPaint);

// /**

// * 位图渲染:BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) // * bitmap:用来做模板的Bitmap;

// * tileX,tileY:横向/纵向的着色规则,类型是TileMode;
// * REPEAT:绘制区域超过渲染区域的部分,重复排版;
// * CLAMP:绘制区域超过渲染区域的部分,会以最后一个像素拉伸排版;
// * MIRROR:绘制区域超过渲染区域的部分,镜像翻转排版;
// */
// mShader = new BitmapShader(mBitmap,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
// mPaint.setShader(mShader);
// canvas.drawRect(0,0,mBitmap.getWidth(),mBitmap.getHeight(), mPaint);
canvas.drawCircle(250,250,250,mPaint);

    /**

* 组合渲染 ComposeShader(@NonNull Shader shaderA,@NonNull Shader shaderB,@NonNull Xfermode mode){ * this(shaderA,shaderB,mode.proterDuffMode);

     * }
     */
    BitmapShader bitmapShader = new BitmapShader(mBitmap,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);
    LinearGradient linearGradient = new LinearGradient(0,0,1000,1600,new int[]{Color.RED,Color.GREEN,Color.BLUE},null,Shader.TileMode.REPEAT);
    mPaint.setShader(mShader);
    canvas.drawCircle(250,250,250,mPaint);
}

/**

* 图层混合模式:PorterDuff.Mode * 它将所绘制图形的像素与 Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值;

* 18中模式:

  • 18中模式:
    • Mode.CLEAR Mode.SRC Mode.DST
    • Mode.SRC_OVER Mode.DST_OVER Mode.SRC_IN
    • Mode.DST_IN Mode.SRC_OUT Mode.DST_OUT
    • Mode.SRC_ATOP Mode.DST_ATOP Mode.XOR
    • Mode.DARKEN Mode.LIGHTEN Mode.MULTIPLY
    • Mode.SCREEN Mode.OVERLAY Mode.ADD
      */

}

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

【Android动画渲染及混合模式】 的相关文章

  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • 导航组件重复 NavArgs 的问题

    我有一个片段 class SomeFragment private val args by navArgs
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 如何将安卓手机从睡眠状态唤醒?

    如何以编程方式将 Android 手机从睡眠状态唤醒 挂起至内存 我不想获取任何唤醒锁 这意味着手机在禁用 CPU 的情况下进入 真正的 睡眠状态 我想我可以使用某种RTC 实时时钟 机制 有人有例子吗 Thanks 为了让Activity
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • 通过 ADB 拔出设备:“找不到服务”

    我必须测试我的应用程序在打瞌睡模式下的行为 根据文档 https developer android com training monitoring device state doze standby html testing doze 我
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • 网络面试题及答案

    1 标准网络线的颜色排列顺序 568B 橙白 橙 绿白 蓝 蓝白 绿 棕白 棕 568A 绿白 绿 橙白 蓝 蓝白 橙 棕白 棕 直通线一般都用 A线序或 B线序 交叉线一端是 568A 一端 是 568B 2 按照数据访问速度排序 硬盘
  • linux内存调试工具集

    除了GDB以外 linux还提供了很多的内存调试工具 注意 以下工具的使用之前 gcc需要使用 g编译出带符号的elf 1 addr2line 用于将可执行文件的虚拟内存地址或者动态库的偏移量转换成函数以及代码行 动态库的偏移量计算方式 将
  • 用python和计算机对话(计算机的语句)

    计算机中的的语句 编程其实就是一个把人类语言转换成计算机语言的过程 再知道每个字是什么意思后 就要把它连成一句话 这样它便有了意义 程序便是由这样一句一句的计算机语句组成的 那么计算机语句都有哪些呢 1 if else语句 if是如果的意思
  • 字节原来这么容易进,是面试官放水,还是公司实在是太缺人?

    本人211非科班 之前在字节和腾讯实习过 这次其实没抱着什么特别大的希望投递 没想到字节可以再给我一次机会 还是挺开心的 本来以为有个机会就不错啦 没想到能成功上岸 在这里要特别感谢帮我内推的同学 中间投递比较曲折 是他帮了我很多 非常负责
  • onlyoffice文档服务器加载慢,【onlyoffice中文指南】12-问题及排除

    作者 日期 雨中星辰 2018 12 20 故障排除 编辑器集成中最常见的问题及解决方法 下载失败 Download failed 下载失败 编辑器加载过程中将显示 下载失败 消息 该文档编辑服务不能上传文件进行编辑 检查document
  • Android自定义View完美实现指示器位置随进度变化的IndicateProgressView

    该文章同步发布在公众号 LinminTech 上 请在本文最后扫码关注 获取更多精彩Android开发文章 效果图 需求 在平时开发过程中 UI经常要求实现如上图所示的ProgressBar 但是Android系统自带的ProgressBa
  • 嵌入式系统学习(七)-bootloader修改实例

    从 github 中下载 Nanopi2 的 uboot 源码后 从源代码根目录中找到 u boot lds 文件 可以看到以下内容 以上片断可以分析出 整个 uboot 程序从 arch arm cpu slsiap s5p4418 st
  • Executors框架——5种常用的线程池介绍及区别

    1 CachedThreadPool线程池 可向下转型为ThreadPoolExecutor 1 1 线程池核心线程数是0 说明线程空闲时 会被自动回收 1 2 任务队列只能有一个任务 而且最大线程数是整数最大值 所以有任务就会创建线程处理
  • Deeplabcut教程(一)安装(GPU&CPU版本)(纯新人向)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 Deeplabcut是什么 二 使用步骤 1 环境配置 1 1安装anaconda 1 2换源 1 2安装CUDA和CUdnn GPU 2 Deeplab
  • Leet1. 两数之和

    给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺
  • 渗透相关问题(二)

    1 报错注入原理是什么 由于后台没有对数据库的信息做过滤 会输出到前台显示 那么我们就可以利用制造报错函数 将查询语句带入到数据库中 以报错信息显示出来 一般是不以网页标签和xpath的路径格式来制造报错 2 常用哪些函数来制造报错 ext
  • git的详细使用

    文章目录 前言 一 Git工作流程 二 Git的安装 配置与使用 1 Git安装与配置 2 从本地仓库推送到远程仓库 2 从远程仓库拉取文件到本地 修改 新增并提交到 更新远程仓库 前言 参考网上文章 在这里总结一篇 方便自己查询 参考1
  • MySQL——root用户密码忘记,重置的操作

    1 通过任务管理器或者服务管理 关掉mysqld 服务进程 2 通过命令行 特殊参数开启 mysqld mysqld defaults file D ProgramFiles mysql MySQLServer5 7Data my ini
  • MIPI M-PHY - D-PHY- C-PHY

    MIPI M PHY MIPI M PHY是物理层 支持所有芯片到芯片的应用 以及高性能的摄像头和内存应用 M PHY可以在高速 HS 模式下运行 支持高达11 6Gb s的超高带宽 也可以在低功耗 LP 模式下运行 M PHY中支持的芯片
  • 启动hadoop,只有两个从节点没有DataNode的异常

    解决办法 在从节点的logs中查看日志如下 发现问题原因是主节点的VERSIONID和从节点不一样导致的 解决办法 1 有重要数据情况下 把主节点的VERSIONID复制到从节点中 2 没有重要数据情况下 把主节点的hdfs文件夹都删掉
  • 【打字母游戏_C语言实现】

    1 项目需求 2 项目分析 3 项目设计 3 1设计字母结构体 3 2屏幕大小 3 3 添加二维数组空格函数 LnitGrid GridArray ga 3 4 显示网格 ShowGrid GridArray ga struct Lette
  • 微信扫码登录功能实现

    原因 很简单 公司的账号登录需要用到微信扫码登录与QQ的登录功能 所以 在做好了微信的扫码登录之后 本人就写这篇微信扫码登录功能实现的教程 教程开始 需要用到的网站 https open weixin qq com 微信开放平台 https
  • 【软考】-高项-沟通管理-子过程ITTO记忆技巧

    沟通管理 贵关键 文章目录 沟通管理 贵关键 规划沟通管理 1 记忆口诀 2 记忆故事 3 输入 工具技术 输出选择理由 管理沟通 1 记忆口诀 2 记忆故事 3 输入 工具技术 输出选择理由 监督沟通 1 记忆口诀 2 记忆故事 3 输入
  • 打不开磁盘“E:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位-000003.vmdk”或它所依赖的某个快照磁盘。

    vmware下启动Centos虚拟机报错虚拟无法打开磁盘 打不开磁盘 E Virtual Machines CentOS 7 64 位 CentOS 7 64 位 000003 vmdk 或它所依赖的某个快照磁盘 或它所依赖的某个快照磁盘
  • 【Android动画渲染及混合模式】

    Android动画渲染及混合模式 public class GradientLayout extends View private Paint mPaint private Shader mShader private Bitmap mBi