# 自定義view————流程位置

madreain發表於2017-09-15

名字真不知道起什麼名字,上效果圖把,原諒我的詞窮(最近在弄weex混合開發,頭都大了,有興趣的可以去研究,有問題一起交流)

效果圖
效果圖

這是這麼樣效果,在實際專案運用到了,想想要是UI給icon多浪費資源呀,乾脆自己上手寫個自定義view來解決

思路分析

看效果圖就是幾個實心圓,幾個空心圓花在一條線上,其中要考慮圓的大小,圓間距。根據這些計算第一個畫圓的開始位置

開始位置的計算:

float statrx = (mwidth - DisplayUtil.dip2px(mcontext, 20) * size) / 2;

開始x=(寬-(實心圓+空心圓)*每一個圓的寬度)/2;計算出開始的x,畫圓從圓心開始,得再把圓半徑加上

float x=statrx+DisplayUtil.dip2px(mcontext, 20)*i+DisplayUtil.dip2px(mcontext, 3.5f);

每一個圓的位置x=開始x+圓寬*個數(0開始)+半徑

開始畫圓

分析的思路大致就能在onDraw開始畫了

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //先計算總量 每一個20
        int size = solidnum + hollownum;
        if (size > 0) {
            float statrx = (mwidth - DisplayUtil.dip2px(mcontext, 20) * size) / 2;
            float y=mheight/2;
            for(int i=0;i<size;i++){
                float x=statrx+DisplayUtil.dip2px(mcontext, 20)*i+DisplayUtil.dip2px(mcontext, 3.5f);
                //畫實心
                if(i<solidnum){
                    canvas.drawCircle(x,y,radius,solidPaint);
                    //畫空心
                }else {
                    canvas.drawCircle(x,y,radius,hollowPaint);
                }
            }
        }
    }複製程式碼

圓畫好了就是一些自定義屬性新增:實心圓個數、空心圓個數、圓顏色

自定義屬性

xml中新增

attrs.xml

    <!--//select-->
    <declare-styleable name="SelectView">
        <attr name="solidnum" format="integer"/>
        <attr name="hollownum" format="integer"/>
    </declare-styleable>複製程式碼

程式碼中獲取

    private void initType(Context context,AttributeSet attrs){
        TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.SelectView);
        solidnum=typedArray.getInteger(R.styleable.SelectView_solidnum,0);
        hollownum=typedArray.getInteger(R.styleable.SelectView_hollownum,0);
        typedArray.recycle();
    }複製程式碼

顏色也是一樣新增,可以自行新增

java程式碼新增

    /***
     *
     * @param solidnum 實心
     * @param hollownum  空心
     */
    public void setSelect(int solidnum, int hollownum) {
        this.solidnum = solidnum;
        this.hollownum = hollownum;
        invalidate();
    }

    /**
     * 支援設定顏色
     * @param red
     * @param green
     * @param blue
     */
    public void setColor(int red, int green, int blue){
        solidPaint.setColor(Color.rgb(red,green,blue));
        hollowPaint.setColor(Color.rgb(red,green,blue));
        invalidate();
    }複製程式碼

完整自定義view程式碼

package com.selectview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;


/**
 * Created by wujun on 2017/9/13.
 * 7個選擇點
 *
 * @author madreain
 * @desc
 */

public class SelectView extends View {
    //實心
    Paint solidPaint;
    //空心
    Paint hollowPaint;
    private int solidnum;
    private int hollownum;

    //寬高
    int mwidth, mheight;
    float radius;
    Context mcontext;

    public SelectView(Context context) {
        super(context);
        mcontext = context;
        init(context);
    }

    public SelectView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mcontext = context;
        initType(context,attrs);
        init(context);
    }

    public SelectView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mcontext = context;
        initType(context,attrs);
        init(context);
    }

    private void initType(Context context,AttributeSet attrs){
        TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.SelectView);
        solidnum=typedArray.getInteger(R.styleable.SelectView_solidnum,0);
        hollownum=typedArray.getInteger(R.styleable.SelectView_hollownum,0);
        typedArray.recycle();
    }

    private void init(Context context) {
        solidPaint = new Paint();
        solidPaint.setAntiAlias(true);
        solidPaint.setColor(Color.rgb(50,193,164));
        solidPaint.setStyle(Paint.Style.FILL);

        hollowPaint = new Paint();
        hollowPaint.setAntiAlias(true);
        hollowPaint.setColor(Color.rgb(50,193,164));
        hollowPaint.setStyle(Paint.Style.STROKE);

        radius = DisplayUtil.dip2px(context, 3.5f);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //寬高
        mwidth = w;
        mheight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //先計算總量 每一個20
        int size = solidnum + hollownum;
        if (size > 0) {
            float statrx = (mwidth - DisplayUtil.dip2px(mcontext, 20) * size) / 2;
            float y=mheight/2;
            for(int i=0;i<size;i++){
                float x=statrx+DisplayUtil.dip2px(mcontext, 20)*i+DisplayUtil.dip2px(mcontext, 3.5f);
                //畫實心
                if(i<solidnum){
                    canvas.drawCircle(x,y,radius,solidPaint);
                    //畫空心
                }else {
                    canvas.drawCircle(x,y,radius,hollowPaint);
                }
            }
        }
    }

    /***
     *
     * @param solidnum 實心
     * @param hollownum  空心
     */
    public void setSelect(int solidnum, int hollownum) {
        this.solidnum = solidnum;
        this.hollownum = hollownum;
        invalidate();
    }

    /**
     * 支援設定顏色
     * @param red
     * @param green
     * @param blue
     */
    public void setColor(int red, int green, int blue){
        solidPaint.setColor(Color.rgb(red,green,blue));
        hollowPaint.setColor(Color.rgb(red,green,blue));
        invalidate();
    }

}複製程式碼

專案中使用

xml佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context="com.selectview.MainActivity">

    <com.selectview.SelectView
        android:id="@+id/selectView1"
        android:layout_width="match_parent"
        android:layout_height="29dp"
        app:hollownum="6"
        app:solidnum="1" />

    <com.selectview.SelectView
        android:id="@+id/selectView2"
        android:layout_width="match_parent"
        android:layout_height="29dp"
        app:hollownum="6"
        app:solidnum="1" />

    <com.selectview.SelectView
        android:id="@+id/selectView3"
        android:layout_width="match_parent"
        android:layout_height="29dp"
        app:hollownum="3"
        app:solidnum="1" />


</LinearLayout>複製程式碼

程式碼中設定

        selectView2.setColor(0,100,0);
        selectView2.setSelect(3,4);

        selectView3.setColor(220,20,60);複製程式碼

SelectView github demo地址

個人部落格

相關文章