在前面一篇博文《Android高仿京东淘宝自动无限循环轮播控件的实现思路和过程》中已经基本介绍了实现轮播广告的基本思路和过程,但是仔细观察淘宝的轮播广告栏,发现在轮播广告栏的底部有个小小的弧形,为了实现更好的效果,在后期中在自己定义的无限轮播控件中添加了底部弧形的实现,在实现的过程中也遇到了一些问题,比较麻烦的就是绘制时弧形出现了锯齿的问题。

实现弧形的主要代码以及实现效果(带有锯齿的情况)

首先要感谢开源 感谢开源框架 https://github.com/florent37/ArcLayout ,弧形的实现效果是根据该框架而来,使用 path 来绘制弧形,首先就是要创建好 path 了。

1. 新建 path

 private Path createClipPath() {
final Path path = new Path();
path.moveTo(0, 0);
path.lineTo(0, height);
path.quadTo(width / 2, height - 2 * arcHeight, width, height);
path.lineTo(width, 0);
path.close(); return path;
}

2.测量计算

绘制弧形是根据轮播控件的宽度和高度而来的,所以需要先测量出轮播控件的宽度和高度,并且当子 View 的位置和尺寸变化时,需要重新测量绘制。

 @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
calculateLayout();
}
} /**
*calculate layout
*/
private void calculateLayout() {
height = getMeasuredHeight();
width = getMeasuredWidth();
if (width > 0 && height > 0) { clipPath = createClipPath();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && arcShape != ArcShape.inSide) {
setOutlineProvider(new ViewOutlineProvider() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void getOutline(View view, Outline outline) {
outline.setConvexPath(clipPath);
}
});
}
}
}

3、绘制弧形

绘制图形时,有一个控件是很重要的,那就是 Canvas 画布,也是最后一步,在画布上面绘制。

 @Override
protected void dispatchDraw(Canvas canvas) {
canvas.save(); canvas.clipPath(clipPath);
super.dispatchDraw(canvas); canvas.restore();
}

4、效果图

运行代码,可以看到效果,效果图如下。

问题

底部的弧形虽然已经绘制成功了,但是从效果图中可以明显看出弧形带有锯齿,效果并不好,再看下现在淘宝的效果,有点困扰了。

解决办法

在网上查找了资料,也没有发现什么好的办法,最后在 Github 上面找到了答案 https://github.com/florent37/ArcLayout/issues/8。

解决方法并不难,但是需要引入另外一个绘图工具 —— Paint,通过 Paint 来消除锯齿,因为 Paint 本身就有自带的消除锯齿的方法 paint.setAntiAlias(true),当然还需要设置下 Xfermode,不过和目前网上提供的方法有所不同了,看下面的代码,修改在画布 Canvas 中的绘制方法。

 @Override
protected void dispatchDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
super.dispatchDraw(canvas);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
canvas.drawPath(clipPath, paint);
canvas.restoreToCount(saveCount);
paint.setXfermode(null);
}

最终效果图

修改代码后运行,获得最终效果,已经明显消除了锯齿,效果优美多了,弧形变得光滑了。

自定义的高仿京东淘宝控件已经修改完成了,代码已经开源在 Github 上面,https://github.com/LT5505/SliderLayout

Android使用Path实现仿最新淘宝轮播广告底部弧形有锯齿的问题以及解决办法的更多相关文章

  1. 原生JavaScript之“淘宝轮播图”

    轮播图是我们学习原生js的必经之路 它包含很多基本知识的运用,像this的使用,DOM的操作,还有setInterval的使用和清除,浮动与定位等等,很好的考察了我们的基础知识牢不牢固, 话不多说,直 ...

  2. jQuery实现淘宝轮播图

    我爱撸码,撸码使我感到快乐大家好,我是Counter今天给大家分享的是利用jQuery来实现淘宝轮播图,揭开这层神秘的面纱,CSS样式就不做过多的赘述了,主要就是实现的原理,也就是jQuery,老样子 ...

  3. Android ROM开发(二)——ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法

    Android ROM开发(二)--ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法 怪自己二了,写好的不小心弄没了,现在只好重新写一些了,上篇简单的配置了一下环境, ...

  4. android关于The connection to adb is down, and a severe error has occured.这个问题的解决办法

    有时在打开模拟器的时候会出现The connection to adb is down, and a severe error has occured.这个问题,这个问题的解决办法有两个: 方法一:找 ...

  5. Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法

    开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应 ...

  6. (重置adb.exe)android关于The connection to adb is down, and a severe error has occured.这个问题的解决办法

    转自:http://www.sjsjw.com/kf_mobile/article/3_24710_14072.asp 这里补充一个更简单的方法(和下面的方法一样的效果): 有时在打开模拟器的时候会出 ...

  7. 淘宝轮播JS

    taobao首页轮播原生js面对对象封装版 Author:wyf 2012/2/25

  8. JS学习笔记 - 运动 - 淘宝轮播图

    <script> window.onload=function () { var oDiv=document.getElementById('play'); var aBtn=oDiv.g ...

  9. Android studio中Rendering Problems不能可视化操作的解决办法

    出现:Rendering Problems the following classes could not be found:android.support.v7.internal.widget.Ac ...

随机推荐

  1. 前端发展态势 && 前端工作流程个人浅析

    于在未开启cleartype的情况下,一些中文字体在非偶数字号下的显示效果欠佳,所以一般建议使用12.14.16.18.22px等偶数字号.也就 是对某个分辨率选择离它最近的偶数字号.例如:屏幕横向分 ...

  2. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

  3. 一个小时学会MySQL数据库

    随着移动互联网的结束与人工智能的到来大数据变成越来越重要,下一个成功者应该是拥有海量数据的,数据与数据库你应该知道. 一.数据库概要 数据库(Database)是存储与管理数据的软件系统,就像一个存入 ...

  4. jQuery的动态绑定事件的应用

    注意:bind()的事件绑定是只对当前页面选中的元素有效.如果你想对动态创建的元素bind()事件,是没有办法达到效果的 <script src="jquery-1.11.2.min. ...

  5. Java面试01|JVM相关

    1.JVM内存查看与分析,编写内存泄露实例 堆区.栈区.方法区.本机内存都有可能内存溢出.在这里编写堆区内存溢出实例.如下(来自<深入理解Java虚拟机>一书. // -Xms20m -X ...

  6. 向php提交数据及json

    php中提交表单有两种方法,即: (1)利用表单提交 例: <form action="php文件名" method='提交方式'> username:<inpu ...

  7. Spring+SpringMVC+MyBatis+easyUI整合基础篇(九)版本控制

    日常啰嗦 还好在第一篇文章里就列好了接下来的主线及要写的知识点,不然都不知道要写什么东西了,开篇里已经列了基础篇要讲svn和git的知识点,所以这一篇就写一下版本控制. 项目实际效果展示在这里,账密: ...

  8. 分享自己使用CSS的public

    body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select,td,figure{marg ...

  9. CoreAnimation 变换

    CoreAnimation 变换 CoreAnimation 目录 博客园MakeDown支持不佳,如有需要请进GitHub 本片博客主要内容: 仿射变换 - CGAffineTransform 3D ...

  10. JAVA基础知识(2)--关键字final的使用

    /***Final关键字的使用*@author lihaiming*Email:912547587@qq.com*关键字Final可以修饰属性,方法,类*修饰属性的时候,final修饰的变量是一个常量 ...