1. 程式人生 > >Android使用Path實現仿最新淘寶輪播廣告底部弧形有鋸齒的問題以及解決辦法

Android使用Path實現仿最新淘寶輪播廣告底部弧形有鋸齒的問題以及解決辦法

在前面一篇博文《Android高仿京東淘寶自動無限迴圈輪播控制元件的實現思路和過程》中已經基本介紹了實現輪播廣告的基本思路和過程,但是仔細觀察淘寶的輪播廣告欄,發現在輪播廣告欄的底部有個小小的弧形,為了實現更好的效果,在後期中在自己定義的無限輪播控制元件中添加了底部弧形的實現,在實現的過程中也遇到了一些問題,比較麻煩的就是繪製時弧形出現了鋸齒的問題。

實現弧形的主要程式碼以及實現效果(帶有鋸齒的情況)

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、效果圖

執行程式碼,可以看到效果,效果圖如下。
效果圖

問題

底部的弧形雖然已經繪製成功了,但是從效果圖中可以明顯看出弧形帶有鋸齒,效果並不好,再看下現在淘寶的效果,有點困擾了。

解決辦法

解決方法並不難,但是需要引入另外一個繪圖工具 —— 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);
    }

最終效果圖

修改程式碼後執行,獲得最終效果,已經明顯消除了鋸齒,效果優美多了,弧形變得光滑了。

這裡寫圖片描述

相關推薦

Android使用Path實現仿最新廣告底部弧形鋸齒的問題以及解決辦法

在前面一篇博文《Android高仿京東淘寶自動無限迴圈輪播控制元件的實現思路和過程》中已經基本介紹了實現輪播廣告的基本思路和過程,但是仔細觀察淘寶的輪播廣告欄,發現在輪播廣告欄的底部有個小小的弧形,為了實現更好的效果,在後期中在自己定義的無限輪播控制元件中添加了

jQuery實現類似

jQuery實現類似淘寶輪播圖 本週的作業是寫一個類似淘寶首頁的jQuery輪播圖,這裡做出記錄。 如有錯誤,歡迎批評指證。 html實現靜態的佈局 靜態佈局分析 一個輪播圖靜態的部分分為三個 展示區 圖片的儲存部分 左右按鈕 下方小圓點作為

原生js實現圖,支援左右和跳轉(滑鼠點多快都不會亂)。

用transform是因為這個比left的效能好。 這個是演示網址(不要直接存下來哦):https://shalltears.github.io/test-sowing-map/ 。 這個是完整程式碼下載地址,覺得還行的下載支援一下:https://download.csdn.ne

396day(fixed, )

《2018年11月4日》【連續396天】 標題:fixed, 淘寶輪播; 內容: <head> <meta charset="UTF-8"> <title>Document</title> <style type="t

JS學習筆記 - 運動 -

  <script> window.onload=function () { var oDiv=document.getElementById('play'); var aBtn=oDiv.getElementsByTagName('ol')[0].getElem

webview圖與Android滑動衝突的解決辦法

在Android中我們經常需要左右滑動,其中內嵌的web頁面也有滑動動作。輪播圖舉例:需要左右翻頁時,會觸發Android中的ViewPager導致翻頁到另一個頁面輪播圖翻頁翻不動,或失效。但是由於安卓是父,而Web是子。在Web中不論你做什麼處理,都管不了父視窗的事情,所以

實現垂直廣告仿頭條) OC版本

1.先上效果圖 2 .可以實現下面效果   1》.可自由定義展示的內容(修改BannerContentView即可)。  2》使用方式類似ListView/RecyclerView。  3》可為當前顯示的內容新增各種事件,比如點選開啟某個頁面等。   4,實現垂直自動輪播

仿京東的秒殺倒計時實現

//菜鳥一枚請多指教 //這個是佈局檔案 <LinearLayout android:id="@+id/ll_xsqg" android:layout_width="match_parent" android:layout_height="wrap_conten

jQuery仿精品服飾廣告實現

技術棧涉及 隱式迭代的遍歷  篩選選擇器 和為元素排序等 程式碼如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>仿淘寶精品

淺談android中僅僅使用一個TextView實現仿京東,各種倒計時

  今天給大家帶來的是僅僅使用一個TextView實現一個高仿京東、淘寶、唯品會等各種電商APP的活動倒計時。最近公司一直加班也沒來得及時間去整理,今天難得休息想把這個分享給大家,只求共同學習,以及自己後續的複習。為什麼會想到使用一個TextView來實現呢?因為最近公司在

用jquery實現帶左右按鍵的

round 500px asc pub video 記錄 找到 blog span 成品如下: 簡單來說就是點擊“右”按鈕時,轉換到右邊的下一幅圖片,同時上面的小方塊顏色也跟著改變,如果已經是最後一幅圖片,再點擊“右”,則轉換到第一幅圖片,是直接向左移找到第一幅圖的,明天

2017最新高轉化詳情頁排版技巧(轉載)

log 產品 風格 span 有用 img 信息 核心 屬於 詳情頁,首先我們要明白一件事情,詳情頁是什麽?是幹什麽的?平時我們在線下門店或商場買東西的時候,我們能直觀的看到商品,可以摸到商品的材質,還可以聽到銷售人員的講解。而淘寶上的商品,用戶只能靠眼睛去看,最終下不下單

jquery實現多模塊切換

jquery css3 說兩句廢話:對於一個小白癡來說,get這些知識真的是有點費勁,我還沒學jquery,看了這對應的公開課後,自己敲了一天才整理好,希望總結後更上一層樓。 最後要完成的效果圖: 效果圖說明: 左邊的框框會一個一個的往後走,第一個(南京)有一個默認的深紅色的背景。 可以隨意的點擊框

Swiper實現全屏視覺差

簡單 ini shee cal 背景圖 reason 教師節 http tor Swiper作為當代流行的js框架,非常受到青睞,這裏演示swiper在pc端全屏視覺輪播的效果,這也是pc端常用的一種特性 一 以教師節為主題的一個全屏輪播   1 首先加載插件,需要用到的

Android使用ViewPager實現左右迴圈滑動及效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

2018最新面試出爐:分散式鎖+叢集+一致Hash演算法+底層技術原理

是需要掌握牢固,重點會問HashMap等集合類,以及多執行緒、執行緒池等。   原文連結:https://blog.csdn.net/SpringJavaMyBatis/article/details/83415696     &n

QML實現網頁左右滑動的圖效果

網頁中有很多的左右滑動的圖片輪動的效果。QML實現此效果的兩種方式。 PageIndicator和TabBar 也對應兩種樣式。 其中左右滑動的動畫效果是利用SwipeView的預設切換動畫效果 import QtQuick 2.9 import QtQuick.Controls 2.

原生js仿網易雲特效

原理:運用兩張圖片切換 可視區域向左走或向右走 要跳轉的圖片定位在可視區域的左邊或右邊 然後用緩動動畫實現切換 重點:緩動動畫 js實現步驟:1、獲取所需元素 2、建立指示器 3.讓第一個選中 4.新增事件 5、切換索引 6、自動輪播 1、獲取所需元素 var slider=$(

實現頁面公告欄迴圈向上

解決方案 1、 HTML 先建一個div層作為公告顯示區,裡面包裹一個公告列表(ul); ? 1 2

jquery實現圖片向左慢慢(滑鼠懸停圖片停止版)

window.onload=function(){ function $(id){ return document.getElementById(id); } var num=0; function autopl