自定義控件之簡易的stepview

先看效果圖

device-2016-07-18-102915.png
class StepView extends View {    
    private int width;  
    private int radius;   
    private Context context; 
    private int lineDistance;    
    private Paint linePaint;
    private Bitmap fail;
    private Bitmap wait;
    private Bitmap success;
    private TextPaint textPaint;
    private StepEntity stepEntity;
    private DashPathEffect dashPathEffect;
    private Paint pathPaint;
    public StepEntity getStepEntity() {
        return stepEntity;
    }
    public void setStepEntity(StepEntity stepEntity) { 
       this.stepEntity = stepEntity; 
       invalidate();
    } 
   public StepView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
   public StepView(Context context) {
        this(context,null);
    }
    public StepView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context=context;
        //進度圓的半徑
        radius=dp2Px(20);
        //兩個圓之間線段的長度
        lineDistance=dp2Px(40);
        //圓之間橫線
        linePaint = new Paint();
        linePaint.setAntiAlias(true);
        linePaint.setColor(Color.BLACK);
        linePaint.setStyle(Paint.Style.STROKE);
        //線段寬度
        linePaint.setStrokeWidth(dp2Px(5));
        //圖片資源
        fail = BitmapFactory.decodeResource(getResources(), R.mipmap.fail);
        wait = BitmapFactory.decodeResource(getResources(), R.mipmap.wait);
        success = BitmapFactory.decodeResource(getResources(), R.mipmap.success);
        //文字paint
        textPaint = new TextPaint();
        textPaint.setAntiAlias(true);
        textPaint.setColor(Color.BLACK);
        textPaint.setTextSize(dp2Px(15));
        //虛線paint
        pathPaint = new Paint();
        pathPaint.setAntiAlias(true);
        pathPaint.setColor(Color.WHITE);
        pathPaint.setStyle(Paint.Style.STROKE);
        pathPaint.setStrokeWidth(dp2Px(2));
        dashPathEffect = new DashPathEffect(new float[]{4,4,4,4},1);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getMeasuredWidth();
        int height=getMeasuredHeight();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int distance;
        //當前應該顯示的狀態(tài)圖片
        Bitmap bitmap;
        for(int i=1;i<=stepEntity.getStep();i++) {
            distance=(i-1)*(lineDistance+2*radius);
            //圖片顯示區(qū)域
            Rect rectF=new Rect();
            rectF.left=distance;
            rectF.top=0;
            rectF.right=distance+2*radius;
            rectF.bottom=radius*2;
            //已完成的步驟
            if(stepEntity.getCurrent()>i){
                bitmap=success;
                linePaint.setColor(Color.BLACK);
            //正在進行中的步驟,這個步驟有可能是失敗的,所以圖片
            }else if(stepEntity.getCurrent()==i){
               if(stepEntity.isFailure()){
                  bitmap=fail;
               }else {
                  bitmap = success;
                }
                linePaint.setColor(Color.RED);
            //未完成的步驟
             }else{
                bitmap=wait;
                linePaint.setColor(Color.RED);
            }
            //繪制圖片
            canvas.drawBitmap(bitmap,null,rectF,null);
            //文字寬高
            Rect bound=new Rect();
            textPaint.getTextBounds(stepEntity.getSteps()[i-1],0,stepEntity.getSteps()[i-1].length(),bound);
            //文字在圓下面5dp
            canvas.drawText(stepEntity.getSteps()[i-1],distance+radius-
bound.width()/2,2*radius+bound.height()+dp2Px(5),textPaint);
          //線段只在總步驟數(shù)>1時繪制
            if(i>1){
                //兩個圓之間線段的起始點 和終點
               int start=2*radius*(i-1)+(i-2)*lineDistance;
                int end=start+lineDistance;
                //已完成的步驟用實線表示
                if(stepEntity.getCurrent()>i){
                    canvas.drawLine(start,radius,end,radius,linePaint);
                //未完成的步驟用虛線表示
                }else {
                    Path path = new Path();
                    path.moveTo(start, radius);
                    path.lineTo(end, radius);
                    pathPaint.setPathEffect(dashPathEffect);
                    canvas.drawPath(path, pathPaint);
                }
            }
        }
    }
    //dp轉(zhuǎn)px
    public  int dp2Px(int dp) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        return dp < 0 ? dp : Math.round(dp*displayMetrics.density);
    }
}

//需要用到的實體類

public class StepEntity {
    //當前步驟
    private int current;
   //步驟下面的文字描述症歇,長度即是步驟數(shù)
    private String[]steps;
    //總的步驟數(shù)
    private int step;
    //當前步驟是否失敗
    private
    public int getCurrent() {
        return current;
    }
    public void setCurrent(int current) {
        if(current<=0){
            current=1;
        }
        this.current = current;
    }
    public String[] getSteps() {
        return steps;
    }
    public void setSteps(String[] steps) {
        this.steps = steps;
    }
    public int getStep() {
        return steps.length;
    }
    public boolean isFailure() {
    return isFailure;
    }
    public void setFailure(boolean failure) {
      isFailure = failure;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郎笆,一起剝皮案震驚了整個濱河市谭梗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宛蚓,老刑警劉巖激捏,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凄吏,居然都是意外死亡远舅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門痕钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來图柏,“玉大人,你說我怎么就攤上這事任连≡榇担” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵随抠,是天一觀的道長裁着。 經(jīng)常有香客問我,道長拱她,這世上最難降的妖魔是什么二驰? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮秉沼,結(jié)果婚禮上诸蚕,老公的妹妹穿的比我還像新娘。我一直安慰自己氧猬,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布坏瘩。 她就那樣靜靜地躺著盅抚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倔矾。 梳的紋絲不亂的頭發(fā)上妄均,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音哪自,去河邊找鬼丰包。 笑死,一個胖子當著我的面吹牛壤巷,可吹牛的內(nèi)容都是我干的邑彪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胧华,長吁一口氣:“原來是場噩夢啊……” “哼寄症!你這毒婦竟也來了宙彪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤有巧,失蹤者是張志新(化名)和其女友劉穎释漆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篮迎,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡男图,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜橱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逊笆。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渗鬼,靈堂內(nèi)的尸體忽然破棺而出览露,到底是詐尸還是另有隱情,我是刑警寧澤譬胎,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布差牛,位于F島的核電站,受9級特大地震影響堰乔,放射性物質(zhì)發(fā)生泄漏偏化。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一镐侯、第九天 我趴在偏房一處隱蔽的房頂上張望侦讨。 院中可真熱鬧,春花似錦苟翻、人聲如沸韵卤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沈条。三九已至,卻和暖如春诅炉,著一層夾襖步出監(jiān)牢的瞬間蜡歹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工涕烧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留月而,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓议纯,卻偏偏與公主長得像父款,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容