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

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

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

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

1. 新建 path

 1 private Path createClipPath() {
 2         final Path path = new Path();
 3         path.moveTo(0, 0);
 4         path.lineTo(0, height);
 5         path.quadTo(width / 2, height - 2 * arcHeight, width, height);
 6         path.lineTo(width, 0);
 7         path.close();
 8
 9         return path;
10 }

2.测量计算

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

 1 @Override
 2     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
 3         super.onLayout(changed, left, top, right, bottom);
 4         if (changed) {
 5             calculateLayout();
 6         }
 7     }
 8
 9     /**
10      *calculate layout
11      */
12     private void calculateLayout() {
13         height = getMeasuredHeight();
14         width = getMeasuredWidth();
15         if (width > 0 && height > 0) {
16
17             clipPath = createClipPath();
18             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && arcShape != ArcShape.inSide) {
19                 setOutlineProvider(new ViewOutlineProvider() {
20                     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
21                     @Override
22                     public void getOutline(View view, Outline outline) {
23                         outline.setConvexPath(clipPath);
24                     }
25                 });
26             }
27         }
28     }

3、绘制弧形

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

1 @Override
2     protected void dispatchDraw(Canvas canvas) {
3         canvas.save();
4
5         canvas.clipPath(clipPath);
6         super.dispatchDraw(canvas);
7
8         canvas.restore();
9     }

4、效果图

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

问题

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

解决办法

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

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

 1 @Override
 2     protected void dispatchDraw(Canvas canvas) {
 3         Paint paint = new Paint();
 4         paint.setAntiAlias(true);
 5         paint.setColor(Color.WHITE);
 6         int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
 7         super.dispatchDraw(canvas);
 8         paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
 9         canvas.drawPath(clipPath, paint);
10         canvas.restoreToCount(saveCount);
11         paint.setXfermode(null);
12     }

最终效果图

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

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

时间: 2024-09-30 05:40:20

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

JQuery仿最新淘宝网首页带箭头幻灯片,JQuery轮播图

JQuery代码 <script type="text/javascript"> $(function() { var $banner = $('.banner'); var $banner_ul = $('.banner-img'); var $btn = $('.banner-btn'); var $btn_a = $btn.find('a') var v_width = $banner.width(); var page = 1; var timer = null;

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

开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应该对ImageView进行设置啦- 解决办法如下喽- 1.在XML文件中设置: android:adjustViewBounds="true" 2.在Java代码中进行设置: mImageView.setAdjustViewBounds(true);

(重置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 这里补充一个更简单的方法(和下面的方法一样的效果): 有时在打开模拟器的时候会出现The connection to adb is down, and a severe error has occured.这个问题,这个问题的解决办法有两个: 方法一:找到adb.exe存放的地方(一般出现这个错误的时候,现在会提示adb.exe的路径),双击adb.exe让他运行就行了 方法二

仿淘宝轮播图片

<script type="text/javascript" src="../js/jquery-1.8.3.min.js"></script>  //引用jquery类库    <style type="text/css">   //自定义页面样式        img{ border:0px;}    *{ margin:0px; padding:0px}    ul,li{ list-style-type

仿淘宝轮播图 ,需要运动框架

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1 {width: 520px; height: 280px; border: 1px solid #000; margin

淘宝轮播图带前后按钮

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

淘宝轮播图

先上图一张: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3 4 <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 5 <head> 6 <meta http-equiv="

Android之——史上最简单图片轮播广告效果实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48049913 如今的Android开发需求越来越来多,实现效果越来越酷炫,很多Android APP都要实现PC网站上那样的图片轮播效果,那么,这些图片的轮播效果是如何实现的呢?下面,我就跟大家一起来实现这些酷炫的功能. 一.原理 首先,将这些要轮播的图片和一些文本分别放置在不同的数据集合中,程序启动的时候默认显示一组图片和文本数据,然后启动一个定时器,每隔一段时间便替换掉显示的

【android】从源码上分析ListView/GridView调用setEmptyView不起作用的原因及解决办法

当我们使用ListView或GridView的时候,当列表为空的时候,我们往往需要一个Loading或者一段提示文字又或者一个特殊的View来提示用户操作,这个时候就用到了setEmptyView()方法. setEmptyView()其实是AdapterView的方法,而我们开发中常用到的ListView, GridView, ExpandableListView等都是继承于AdapterView的,所以可以直接调用这个方法. 但是问题来了,当你这个emptyview不在当前的View hie