zoukankan      html  css  js  c++  java
  • Android按钮式进度条

      1 package com.example.progress.demo;
      2 
      3 import android.annotation.SuppressLint;
      4 import android.content.Context;
      5 import android.content.res.TypedArray;
      6 import android.graphics.Canvas;
      7 import android.graphics.Color;
      8 import android.graphics.Paint;
      9 import android.graphics.Paint.FontMetrics;
     10 import android.graphics.RectF;
     11 import android.util.AttributeSet;
     12 import android.util.Log;
     13 import android.view.MotionEvent;
     14 import android.view.View;
     15 
     16 import com.example.firstapp.R;
     17 
     18 @SuppressLint("DrawAllocation")
     19 public class ProgressButton extends View {
     20     private FontMetrics fm;
     21     private int progress = 0;
     22     private int textColor = Color.WHITE;
     23     private Paint paint;
     24     private float textSize = 10;
     25     private int foreground;
     26     private int backgroundColor;
     27     private String text;
     28     private int max = 100;
     29     private int corner = 5;// 圆角的弧度
     30     private OnProgressButtonClickListener buttonClickListener;
     31 
     32     public ProgressButton(Context context, AttributeSet attrs) {
     33         super(context, attrs);
     34         init(context, attrs);
     35     }
     36 
     37     public ProgressButton(Context context, AttributeSet attrs, int defStyle) {
     38         super(context, attrs, defStyle);
     39         init(context, attrs);
     40     }
     41 
     42     private void init(Context context, AttributeSet attrs) {
     43         TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton);
     44         this.backgroundColor = typedArray.getInteger(R.styleable.ProgressButton_background, Color.parseColor("#C6C6C6"));
     45         this.foreground = typedArray.getInteger(R.styleable.ProgressButton_foreground,  Color.rgb(20,131,214));
     46         this.textColor = typedArray.getInteger(R.styleable.ProgressButton_textcolor, Color.WHITE);
     47         this.max = typedArray.getInteger(R.styleable.ProgressButton_max, 100);
     48         this.progress = typedArray.getInteger(R.styleable.ProgressButton_progress, 0);
     49         this.text = typedArray.getString(R.styleable.ProgressButton_text);
     50         this.textSize = typedArray.getDimension(R.styleable.ProgressButton_textSize, 20);
     51         typedArray.recycle();
     52     }
     53 
     54     @Override
     55     protected void onDraw(Canvas canvas) {
     56         super.onDraw(canvas);
     57         paint = new Paint();
     58         paint.setAntiAlias(true);
     59         paint.setStrokeWidth(5);
     60 
     61         /**
     62          * 绘制背景
     63          */
     64         RectF oval = new RectF(0, 0, getWidth(), getHeight());
     65 
     66         paint.setColor(this.backgroundColor);
     67         canvas.drawRoundRect(oval, corner, corner, paint);
     68 
     69         /***
     70          * 绘制进度值
     71          */
     72         
     73         paint.setColor(foreground);
     74         if (progress <= corner) {
     75             oval = new RectF(0, corner - progress, getWidth() * this.progress / this.max, getHeight()
     76                     - corner + progress);
     77             canvas.drawRoundRect(oval, progress,progress, paint);
     78         } else {
     79             oval = new RectF(0, 0, getWidth() * this.progress / this.max, getHeight());
     80             canvas.drawRoundRect(oval, corner, corner, paint);
     81         }
     82 
     83         /***
     84          * 绘制文本
     85          */
     86         if ("".equals(text) || text == null) {
     87             return;
     88         }
     89         paint.setTextSize(this.textSize);
     90         fm = paint.getFontMetrics();
     91         paint.setColor(this.textColor);
     92 
     93         float textCenterVerticalBaselineY = getHeight() / 2 - fm.descent + (fm.descent - fm.ascent) / 2;
     94         canvas.drawText(this.text, (getMeasuredWidth() - paint.measureText(this.text)) / 2, textCenterVerticalBaselineY,
     95                 paint);
     96 
     97         
     98     }
     99 
    100     /**
    101      * 设置最大值
    102      * 
    103      * @param max
    104      */
    105     public void setMax(int max) {
    106         this.max = max;
    107     }
    108 
    109     /**
    110      * 设置文本提示信息
    111      * 
    112      * @param text
    113      */
    114     public void setText(String text) {
    115         this.text = text;
    116     }
    117 
    118     /**
    119      * 设置进度条的颜色值
    120      * 
    121      * @param color
    122      */
    123     public void setForeground(int color) {
    124         this.foreground = color;
    125     }
    126 
    127     /**
    128      * 设置进度条的背景色
    129      */
    130     public void setBackgroundColor(int color) {
    131         this.backgroundColor = color;
    132     }
    133 
    134     /***
    135      * 设置文本的大小
    136      */
    137     public void setTextSize(int size) {
    138         this.textSize = size;
    139     }
    140 
    141     /**
    142      * 设置文本的颜色值
    143      * 
    144      * @param color
    145      */
    146     public void setTextColor(int color) {
    147         this.textColor = color;
    148     }
    149 
    150     /**
    151      * 设置进度值
    152      * 
    153      * @param progress
    154      */
    155     public void setProgress(int progress) {
    156         if(progress>max){
    157             return;
    158         }
    159         this.progress=progress;
    160         //设置进度之后,要求UI强制进行重绘
    161         postInvalidate();
    162     }
    163     
    164     public int getMax(){
    165         return max;
    166     }
    167     
    168     public int getProgress(){
    169         return progress;
    170     }
    171     
    172     @SuppressLint("ClickableViewAccessibility")
    173     @Override
    174     public boolean onTouchEvent(MotionEvent event) {
    175         switch (event.getAction()) {
    176         case MotionEvent.ACTION_UP:
    177             buttonClickListener.onClickListener();
    178             break;
    179         default:
    180             break;
    181         }
    182         return true;
    183     }
    184     
    185     public void setOnProgressButtonClickListener(OnProgressButtonClickListener clickListener){
    186         buttonClickListener = clickListener;
    187     }
    188     
    189     public interface OnProgressButtonClickListener{
    190         public void onClickListener();
    191     }
    192
    <declare-styleable name="ProgressButton">
      <attr name="background" format="color" />
      <attr name="foreground" format="color" />
      <attr name="textcolor" format="color" />
      <attr name="max" />
      <attr name="progress" />
      <attr name="textSize" />
      <attr name="text" format="string" />
    </declare-styleable>
    

      

    193 }

    
    
    
  • 相关阅读:
    人工智能背后的故事
    idea 开发插件。
    安卓工作室 Android studio 或 Intellij IDEA 美化 修改 汉化 酷炫 装逼 Android studio or Intellij IDEA beautify modify Chinesization cool decoration
    安卓工作室 android studio文件和代码模板,以及汉化出错问题
    安卓工作室 android studio 汉化后,报错。 设置界面打不开。Can't find resource for bundle java.util.PropertyResourceBundle, key emmet.bem.class.name.element.separator.label
    android studio的汉化 教程 及解析
    安卓工作室Android Studio 快捷键
    安卓工作室 android studio 的 汉化 美化 定制 Android studio's Chinesization beautification customization
    VR开发 VR development
    Lakeshore 中文开发界面,示例项目,飞机大战 等 Lakeshore Chinese development interface, sample project, aircraft war, etc
  • 原文地址:https://www.cnblogs.com/tianshidechibang234/p/4535365.html
Copyright © 2011-2022 走看看