1. 程式人生 > >【Android 進階】Android自定義系列:邊緣凹凸的卡劵效果

【Android 進階】Android自定義系列:邊緣凹凸的卡劵效果

所謂前人栽樹,後人乘涼,在此感謝博主的貢獻。
原文:邊緣凹凸的卡劵效果

先上效果圖:

這裡寫圖片描述

我實現的效果和原博主實現的效果是不一樣的,我是左右邊緣凹凸,而博主是上下邊緣凹凸。其實理解了原理,哪個邊緣實現這個效果都是可以的。

實現原理:

直接在view邊緣上畫一個個白色的小圓來實現這種效果,這個view:CouponView
可以讓它繼承LinearLayout,通過重寫onDraw()方法實現重新繪製的效果。最後在佈局檔案中使用該自定義CouponView即可。

畫圓的個數如何確定:

(這是原博主的經驗,總結的的確很好)

假如我們上下線的半圓以及半圓與半圓之間的間距是固定的,那麼不同尺寸的螢幕肯定會畫出不同數量的半圓,那麼我們只需要根據控制元件的寬度來獲取能畫的半圓數。
大家觀察圖片,很容易發現,圓的數量總是圓間距數量-1,也就是,假設圓的數量是circleNum,那麼圓間距就是circleNum+1。
所以我們可以根據這個計算出
circleNum. circleNum = (int) ((w-gap)/(2*radius+gap));
這裡gap就是圓間距,radius是圓半徑,w是view的寬。

自定義LinearLayout:CouponView

/**
 * Created by Veyron on 2017/2/20.
 * Function:自定義實現邊緣凹凸卡卷效果
 */

public class CouponView extends LinearLayout {

    private Paint mPaint;       //畫筆
    private float gap = 8;      //圓間距  
    private float radius = 10;  //半徑    
    private int circleNum;      //圓數量
    private
float remain; private float width; //檢視寬 public CouponView(Context context) { super(context); } public CouponView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//設定是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。 mPaint.setDither(true
);//設定是否使用影象抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,影象更加清晰 mPaint.setColor(Color.WHITE); mPaint.setStyle(Paint.Style.FILL); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); width = w; if (remain==0){ //計算不整除的剩餘部分 remain = (int)(h-gap)%(2*radius+gap); } circleNum = (int) ((h-gap)/(2*radius+gap)); //計算圓的數量 } public CouponView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * 上面定義了圓的半徑和圓間距,同時初始化了這些值並且獲取了需要畫的圓數量。 接下來只需要一個一個將圓畫出來就可以了。 * @param canvas */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //迴圈在左右兩個邊上畫出凹凸效果 for (int i=0;i<circleNum;i++){ float y = gap+radius+remain/2+((gap+radius*2)*i);//計算出y軸座標 canvas.drawCircle(0,y,radius,mPaint);//在左邊邊畫圓 canvas.drawCircle(width,y,radius,mPaint);//在右邊畫圓 } } }

簡單的根據circleNum的數量進行了圓的繪製。
這裡remain/2是因為,可能一些情況,計算出來的可以畫的數量不是剛好整除的。這樣就會出現右邊最後一個間距會比其它的間距都要寬。
所以我們在繪製第一個的時候加上了餘下的間距的一半,即使是不整除的情況。至少也能保證第一個和最後一個間距寬度一致。

佈局檔案使用該自定義LinearLayout:CouponView

裡面的具體佈局就看業務需求了

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp">
    <com.veyron.www.couponview.view.CouponView
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FF5216"
        android:padding="20dp">
        <ImageView
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:src="@drawable/hanber"
            android:scaleType="centerCrop"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="16dp">
            <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="26dp"
                android:textColor="#000000"
                android:text="優惠漢堡劵"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="18dp"
                android:padding="5dp"
                android:text="編號:007"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20dp"
                android:padding="5dp"
                android:text="優惠價:¥18"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="12dp"
                android:paddingLeft="5dp"
                android:paddingTop="5dp"
                android:text="截止日期:2017-06-09"
                />
        </LinearLayout>
    </com.veyron.www.couponview.view.CouponView>

</FrameLayout>

原始碼:

覺得不錯,歡迎點個Star 哈!!

相關推薦

Android Android定義系列邊緣凹凸的卡效果

所謂前人栽樹,後人乘涼,在此感謝博主的貢獻。 原文:邊緣凹凸的卡劵效果 先上效果圖: 我實現的效果和原博主實現的效果是不一樣的,我是左右邊緣凹凸,而博主是上下邊緣凹凸。其實理解了原理,哪個邊緣實現這個效果都是可以的。 實現原理: 直接

Android 仿抖音系列之翻頁上下滑切換視訊(四)

大家好,我們又見面了。這是這個系列的第四篇,在這篇文章之前,建議可以先看下之前系列的文章,為了節省篇幅,之前詳細說過的地方,這裡就不再詳細描述了,下面是目錄: 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊

Android 仿抖音系列之列表播放視訊(三)

在上一篇【Android 進階】仿抖音系列之列表播放視訊(二)中,我們實現列表播放視訊,這一篇我們來對其做些優化。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android 進階】仿抖音

Android 仿抖音系列之列表播放視訊(二)

上一篇中,我們實現了仿抖音上下翻頁切換視訊的效果,詳見【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一),這一篇,我們來實現抖音列表播放視訊。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二)

Android 仿抖音系列之翻頁上下滑切換視訊(一)

最近公司在做個短視訊的專案,其中借鑑了很多抖音的設計,其中就有抖音的上下滑切換視訊。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android 進階】仿抖音系列之列表播放視訊(三)

Android 仿抖音系列之視訊預覽和錄製(五)

大家好,又見面了。在前幾篇中,我們通過2種方式實現了仿抖音的翻頁切換視訊,仿抖音列表播放視訊功能,這一篇,我們來說說視訊的錄製。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android

AndroidAIDL使用定義型別

原文首發於微信公眾號:jzman-blog,歡迎關注交流! 上篇文章中主要介紹從 AIDL 的使用方式以及 Android 開發中不同程序之間的通訊,遺留的問題是如何在 AIDL 中使用自定義型別,具體步驟如下: 1. 建立自定義型別 2. 宣告自定義型別 3.

Android——巧借定義VideoView實現Activity的動態視訊背景

引言 話說這個Activity 動態背景我第一次是在一個菠菜App上看到的,當時感覺逼格很高,最近正好用到專案中,而且好像好久沒有寫關於UI這些“有趣”的文章啦,這篇文章就簡單小結下,其實實現動態背景這並不是唯一的方案,還有其他的方式。 一、VideoView

Android之AlertDialog定義

AlertDialog的自定義方式有很多種,這裡介紹兩種。第一種是比較簡單的,只自定義內容。一、簡單的AlertDialog(只顯示一段簡單的資訊,比如about us)二、帶按鈕的AlertDialog(顯示提示資訊,讓使用者操作,比如exit時的警告框)三、類似ListV

定義控制元件——邊緣凹凸的優惠券效果

轉載地址:http://blog.csdn.net/yissan/article/details/51429281 實現分析 上面的圖片其實和普通的Linearlayout,RelativeLayout一樣,只是上下兩邊多了類似於半圓鋸齒的形狀。那麼只需要處理不同地方。

Android如何寫一個很屌的動畫(1)---先實現一個簡易的定義動畫框架

class MyView extends View { public void onDraw(Canvas canvas) { super.onDraw(canvas); invalidate(); } } 這樣一來,View每次繪製都是觸發下一次繪製,不過

Android(3)Android圖像處理

progress chang etc geo xtend static ogr arch 取出 1. 概念 色調/色相:物體傳遞的顏色 飽和度:顏色的純度,從0(灰)到100%(飽和)來進行描寫敘述 亮度/明度:顏色的相對明暗程度 2. 調整圖像小Demo 創建一個

AndroidJunit單元測試環境搭建以及簡單有用

rar theme 選擇 http 技術分享 才幹 ack package family 單元測試的目的 首先。Junit單元測試要實現的功能,就是用來測試寫好的方法是否可以正確的運行,一般多用於對業務方法的測試。 單元測試的環境配置 1.在Andro

Android 圖片載入框架之Glide

生活 cannot 簡單介紹 style codes 詳細 npr 濾鏡 ive 簡單介紹 在泰國舉行的谷歌開發人員論壇上,谷歌為我們介紹了一個名叫 Glid

Android 一鍵清理

一鍵清理流程圖 系統快取分析 Android 已安裝 app /data/data/packagename/cache 資料夾和 /sdcard/Android/data/packagename/cache 資料夾組成 原生設定(Settings

Android實現各種各樣的Tab切換效果

一、View  + ViewPager 使用ViewPager和View實現切換效果,效果如下: 主佈局介面: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

python定義庫函式

在python使用過程中,在不同的專案裡,常常會出現頻繁地自定義同一個函式的情況。為了解決這個問題,我們可以選擇建立一個自定義的庫,並將其新增到系統路徑中 具體操作如下: 在任意位置新建一個專案my_libs,並在其中新建python檔案my_lib1和m

Android ORM 框架之 greenDAO學習筆記

前言 當初學習Hibernate的時候就非常驚歎這種ORM思想,後來才知道原來Android中也有這種基於ORM思想的開源框架greenDAO。 greenDAO簡介: 簡單的講,greenDAO 是一個將物件對映到 SQLite 資料庫

Android判斷網路連線狀態並自動介面跳轉

用於判斷軟體開啟時的網路連線狀態,若無網路連線,提醒使用者跳轉到設定介面 /** * 設定在onStart()方法裡面,可以在介面每次獲得焦點的時候都進行檢測 */ @Override

Android CSDN新聞類客戶端-練手專案

無圖無真相: 宣告: 本專案資料全部來自CSDN官網,純練手之作,個人未從中獲取任何利益,資料的獲取與共享可能會侵犯到CSDN的權益,若被告知需停止共享與使用,本人會立即刪除整個專案。