全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android自定义view利用Xfermode实现动态文字加载动画

对于Xfermode 可能很多人看了一些就放弃了,今天我就个人理解,举简单的我们生活中的例子,让大家更容易理解这是个什么东西。其实并不是你们想象的那么难,你只要懂三步就够了。先来看一看这次的效果图,这个gif大家凑合看。

不要把Xfermode 想的这么难,我把Xfermode 理解成中学时 学的“集合” ,我们知道“集合”是处理 数据的。例如:
集合 A={1,2,3,4},集合B={3,4,5,6}。这两个集合 有三个属性,交集,并集,补集
那么 Xfermode 我个人理解就是图形集合,就是图形A,图形B 之间可以取,交集,并集,补集。当然这个 A和 B 之间取那种类型,形成什么样的 效果,其实就是我们选取的 Xformode 的 属性类型。
这个就引出了我们今天 的 第一步,虽然是三步,但是前提是你要对自定义view 有一定的了解比如你要知道 ondraw(),onmesure(),Paint 画笔,canvars画布这些内容你要了解,对自定义不是很清楚的朋友可以去 看我的同类文章,文章从入门一步一步带大家进入自定义view:

第一步:我们要熟悉一下这个图

16个图形结果,其实现在有18中。这个图 我们也不用记,只要在用的时候选择对应得 我们的目标图形就行了。具体怎么使用 我们要引出我们今天主要的类 PorterDuffXfermode 这个类就是我们的Xformode 的类了,他还有另外被废弃的两兄弟,被废弃了就不谈了。既然是各类我们要使用就要创建对象,如下:

PorterDuffXfermode xfermode = new 
PorterDuffXfermode(PorterDuff.Mode.SRC_IN);

这里就是我们的 对象,在这里他的构造参数中就是我们上图 选择的类型,最终图形是两个图形的交集部分。当然你可以根据你的目标图形 的效果自己选择,两个图片的混排类型。
这就是 第一步,我们只要了解一下图片的意义,和 PorterDuffXfermode 这个类的用法就够了。我这里提到的 所有图不只是图片,还有我们绘制出来的 圆,矩形等绘制的图。

第二步:

我们了解了 图形 混排的模式,所以第二步我们要有两个图,不然怎么混排,从图中我们可以看出这两个图,分别是 Src ,Dst。接下来我会介绍这两个名字对应我们手机上那个图形。因为我们要画图所以 我们就要来到 ondraw()方法了,这个方法有个类叫canvas 图层,所以这就到了我们第二步的关键点:那就是设置图层,调用方法

canvas.saveLayer( left, top, right, bottom, paint, saveFlags)

首先前四个方法比较简单,就是我们要设置这个图层 的大小,第5个方法就是我们的 画笔,第6个方法我们使用:Canvas.ALL_SAVE_FLAG ,这是一个flag。

注意:我们在绘制图形之前必须调用上面的方法,不然没有效果。

下面是这个绘制的先后顺序:

/**
 * 设置图层
 */
int layer = canvas.saveLayer(0,0,w,h,paint,Canvas.ALL_SAVE_FLAG);
//绘制背景图片
canvas.drawBitmap(bitmap,0,0,paint);
//设置 xformode 模式
paint.setXfermode(xfermode);
//绘制矩形
paint.setColor(Color.RED);
RectF rectF = new RectF(0,y,bitmap.getWidth(),bitmap.getHeight());
canvas.drawRect(rectF,paint);
//最后设置为空
paint.setXfermode(null);
canvas.restoreToCount(layer);

第三步:

第三步我们还是围绕着上边的代码讲,因为就这几行代码,因为很简单。设置好图层之后,就要绘制图形了,我们这里用canvas绘制了一个 bitmap 图片。大家注意了我们此时 用的 paint 只是普通的 画笔,到这个时候我们的 PorterDuffXfermode 模式还没有使用呢!
再往下看 我们的画笔调用了:

paint.setXfermode(xfermode);

这个方法,所以 如果我们再绘制图形的画,再用到的 画笔 就和我们之前 绘制的图形 不一样了。这个方法可以说是一个分界点,在这个方法之前绘制的图形 和 之后绘制的图形 就分别对应了 我们 图中 Src 和 Dst 的图。这就决定我们最终的目标图形是什么样的。

最后就是把画笔的 xformode 模式设置为空。再调用canvas的这个方法

canvas.restoreToCount(layer);

我们的绘制就结束了。我这里使用动画动态的改变了 矩形 的高度。我把这个 图片 贴给大家,图片还是盗 别人的。哈哈。

大家可以下载使用。

把代码也贴出来,大家参考。以上 都是我个人的理解 ,包括给大家举的例子,如果有不妥之处请指出,谢谢。

public class XformodeView extends View {

 Paint paint ;

 //屏幕宽高
 int w;
 int h;
 //定义一个矩形的高度变化
 float y;

 //xformode 的 类型 选择
 PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
 //图片
 Bitmap bitmap;

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

 public XformodeView(Context context, @Nullable AttributeSet attrs) {
 this(context,attrs,0);
 }

 public XformodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);

 //画笔
 paint = new Paint();
 paint.setAntiAlias(true);
 paint.setDither(true);

 init(context);
 }

 /**
 * 初始化
 * @param context
 */
 public void init(Context context){
 //获得屏幕宽高
 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
 w = wm.getDefaultDisplay().getWidth();
 h = wm.getDefaultDisplay().getHeight();
 //加载bitmap 图片
 bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.xxx);
 //开始动画
 animator();
 }

 /**
 * 测量view
 */
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);

 setMeasuredDimension(bitmap.getWidth(),bitmap.getHeight());
 }

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

 /**
  * 绘制 图片 剪切 画布 控制图片显示
  */
// Path path = new Path();
// path.moveTo(0,y);
//
// path.lineTo(bitmap.getWidth(),y);
// path.lineTo(bitmap.getWidth(),bitmap.getHeight());
// path.lineTo(0,bitmap.getHeight());
// canvas.clipPath(path);

 /**
  * 设置图层
  */
 int layer = canvas.saveLayer(0,0,w,h,paint,Canvas.ALL_SAVE_FLAG);
 //绘制背景图片
 canvas.drawBitmap(bitmap,0,0,paint);
 //设置 xformode 模式
 paint.setXfermode(xfermode);
 //绘制矩形
 paint.setColor(Color.RED);
 RectF rectF = new RectF(0,y,bitmap.getWidth(),bitmap.getHeight());
 canvas.drawRect(rectF,paint);
 //最后设置为空
 paint.setXfermode(null);
 canvas.restoreToCount(layer);
 }

 /**
 * 动画
 */
 public void animator(){

 ValueAnimator animator = ValueAnimator.ofFloat(bitmap.getHeight(),0);
 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
  y = (float) animation.getAnimatedValue();
  invalidate();
  }
 });
 animator.setDuration(3000);
 animator.start();
 }
}

你也可以做一些复杂的效果,比如你不用矩形,你可以用波浪的效果让他充满。发挥想象力去做吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android动态文字加载动画  # Android  # view动态文字加载动画  # Android加载动画  # Android自定义view实现动态柱状图  # Android自定义View制作动态炫酷按钮实例解析  # 利用Android画圆弧canvas.drawArc()实例详解  # Android自定义view之利用drawArc方法实现动态效果(思路详解)  # 图层  # 这两个  # 自定义  # 第二步  # 为空  # 你要  # 我把  # 这就  # 给大家  # 三步  # 图中  # 第三步  # 都是  # 是一个  # 我就  # 在这里  # 还没有  # 我会  # 看了  # 有个 


相关文章: 简单实现Android文件上传  图册素材网站设计制作软件,图册的导出方式有几种?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站VPS推荐:2025年高性能服务器配置指南  如何在阿里云部署织梦网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  完全自定义免费建站平台:主题模板在线生成一站式服务  如何零成本快速生成个人自助网站?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  建站之星如何实现五合一智能建站与营销推广?  建站主机空间推荐 高性价比配置与快速部署方案解析  建站之星官网登录失败?如何快速解决?  如何在阿里云完成域名注册与建站?  制作宣传网站的软件,小红书可以宣传网站吗?  如何快速搭建虚拟主机网站?新手必看指南  制作公司内部网站有哪些,内网如何建网站?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  宝塔Windows建站如何避免显示默认IIS页面?  网站制作需要会哪些技术,建立一个网站要花费多少?  建站之星如何实现PC+手机+微信网站五合一建站?  建站主机选购指南:核心配置优化与品牌推荐方案  网站设计制作企业有哪些,抖音官网主页怎么设置?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  小型网站建站如何选择虚拟主机?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  建站之星导航菜单设置与功能模块配置全攻略  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  孙琪峥织梦建站教程如何优化数据库安全?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站之星图片链接生成指南:自助建站与智能设计教程  建站之星各版本价格是多少?  制作销售网站教学视频,销售网站有哪些?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  宝塔新建站点报错如何解决?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  PHP 500报错的快速解决方法  建站主机选购指南与交易推荐:核心配置解析  如何打造高效商业网站?建站目的决定转化率  如何快速生成凡客建站的专业级图册?  如何在局域网内绑定自建网站域名?  如何在服务器上配置二级域名建站?  如何在七牛云存储上搭建网站并设置自定义域名?  建站主机如何安装配置?新手必看操作指南  宝塔建站教程:一键部署配置流程与SEO优化实战指南  ,怎么用自己头像做动态表情包?  香港网站服务器数量如何影响SEO优化效果?  ,南京靠谱的征婚网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。