对于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方法实现动态效果(思路详解)
# 图层
# 这两个
# 自定义
# 第二步
# 为空
# 你要
# 我把
# 这就
# 给大家
# 三步
# 图中
# 第三步
# 都是
# 是一个
# 我就
# 在这里
# 还没有
# 我会
# 看了
# 有个
相关文章:
建站10G流量真的够用吗?如何应对访问高峰?
七夕网站制作视频,七夕大促活动怎么报名?
高端云建站费用究竟需要多少预算?
如何在阿里云通过域名搭建网站?
高端网站建设与定制开发一站式解决方案 中企动力
宝塔新建站点报错如何解决?
网站制作的步骤包括,正确网址格式怎么写?
定制建站策划方案_专业建站与网站建设方案一站式指南
如何将凡科建站内容保存为本地文件?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
小型网站制作HTML,*游戏网站怎么搭建?
如何快速搭建安全的FTP站点?
寿县云建站:智能SEO优化与多行业模板快速上线指南
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
完全自定义免费建站平台:主题模板在线生成一站式服务
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
制作表格网站有哪些,线上表格怎么弄?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
建站主机与虚拟主机有何区别?如何选择最优方案?
建站上传速度慢?如何优化加速网站加载效率?
清除minerd进程的简单方法
家庭服务器如何搭建个人网站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
如何选择建站程序?包含哪些必备功能与类型?
公众号网站制作网页,微信公众号怎么制作?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何在VPS电脑上快速搭建网站?
C++中引用和指针有什么区别?(代码说明)
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
开封网站制作公司,网络用语开封是什么意思?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
SQL查询语句优化的实用方法总结
网站制作大概多少钱一个,做一个平台网站大概多少钱?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何快速搭建高效服务器建站系统?
建站之星后台密码遗忘或太弱?如何重置与强化?
实现虚拟支付需哪些建站技术支撑?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
广平建站公司哪家专业可靠?如何选择?
制作营销网站公司,淘特是干什么用的?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
建站之星备案是否影响网站上线时间?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
常州企业网站制作公司,全国继续教育网怎么登录?
*请认真填写需求信息,我们会在24小时内与您取得联系。