最近修改公司商城專案,需要加入優惠券/卡券,今天就給大家帶來自定義view————卡券,效果圖如下
分析一下過程:因為除了背景以外,裡面還要放其他的控制元件,這裡採取繼承RelativeLayout去畫鋸齒背景,雖然也可以繼承LinearLayout,但是考慮到佈局的巢狀問題還是最終選取了RelativeLayout,然後根據寬度計算出能放多少個圓,然後剩餘多少寬度,然後兩邊對半分
計算圓數量
view的寬度=圓+間距+多餘寬度,因此我們先寫固定的圓半徑、圓與圓之間的間距、然後計算出能放多少個圓
//圓半徑
int radius = 10;
//圓間距
int gap = 8;
//圓數量
int circleNum;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//計算圓的數量
circleNum = (w - gap) / (radius * 2 + gap);
}複製程式碼
但是又考慮到平分的時候寬度還有剩餘的,為了視覺更佳,將剩餘寬度一分為二放首尾
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
remain = ((w - gap) % (radius * 2 + gap)) / 2;
circleNum = (w - gap) / (radius * 2 + gap);
mheight = h;
}複製程式碼
畫鋸齒背景
計算出view的寬度和高度,根據計算的圓數量進行迴圈畫圓,y軸分別為0,mheight
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < circleNum; i++) {
float x = gap + radius + remain + ((gap + radius * 2) * i);
canvas.drawCircle(x, 0, radius, mPaint);
canvas.drawCircle(x, mheight, radius, mPaint);
}
}複製程式碼
大致效果已經出來了,現在將自定義屬性寫成xml中可自定義的
屬性設定
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CardView">
<attr name="cirlceColor" format="color"/>
<attr name="radius" format="integer"/>
<attr name="gap" format="integer"/>
</declare-styleable>
</resources>複製程式碼
自定義view中獲取屬性進行設定
private void initTypeArray(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CardView);
cirlceColor = typedArray.getColor(R.styleable.CardView_cirlceColor, Color.WHITE);
radius = typedArray.getInteger(R.styleable.CardView_radius, 10);
gap = typedArray.getInteger(R.styleable.CardView_gap, 8);
typedArray.recycle();
}複製程式碼
xml中應用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context="com.cardview.MainActivity">
<com.cardview.CardView
android:layout_width="320dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:background="@color/colorAccent"
app:cirlceColor="@android:color/white"
app:gap="10"
app:radius="20">
<ImageView
android:id="@+id/img"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_marginStart="20dp"
android:background="@mipmap/ic_launcher_round"
android:contentDescription="@null" />
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@+id/img"
android:layout_toRightOf="@+id/img"
android:padding="20dp"
android:text="優惠券"
android:textSize="36sp" />
<TextView
android:id="@+id/txt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt1"
android:layout_toEndOf="@+id/img"
android:layout_toRightOf="@+id/img"
android:padding="10dp"
android:text="編號:1234567890"
android:textSize="16sp" />
<TextView
android:id="@+id/txt3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt2"
android:layout_toEndOf="@+id/img"
android:layout_toRightOf="@+id/img"
android:padding="10dp"
android:text="日期:2017年8月25日"
android:textSize="16sp" />
</com.cardview.CardView>
</RelativeLayout>複製程式碼
然後效果圖就是上面的了