《Android群英传》Three重写View实现全新控件弧线展示图

1、自定义View

package sunny.example.ahthreearc;

import android.annotation.SuppressLint;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.RectF;

import android.util.AttributeSet;

import android.view.View;
@SuppressLint("InlinedApi")

public class ArcView extends View {
    private int mMeasureHeigth;
    private int mMeasureWidth;
    private Paint mCirclePaint;
    private float mCircleXY;
    private float mRadius;
    private Paint mArcPaint;
    private RectF mArcRectF;
    private float mSweepAngle;
    private float mSweepValue = 66;
    private Paint mTextPaint;
    private String mShowText;
    private float mShowTextSize;
  
    public ArcView(Context context, AttributeSet attrs,
                              int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public ArcView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ArcView(Context context) {
        super(context);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec,
                             int heightMeasureSpec) {
        mMeasureWidth = MeasureSpec.getSize(widthMeasureSpec);
        mMeasureHeigth = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(mMeasureWidth, mMeasureHeigth);
        initView();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
       
        //绘制圆
      
        canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint);
     
       //绘制弧线
       
        canvas.drawArc(mArcRectF, 270, mSweepAngle, false, mArcPaint);
      
        //绘制文字
       
        canvas.drawText(mShowText, 0, mShowText.length(),
                mCircleXY, mCircleXY + (mShowTextSize / 4), mTextPaint);
    }
   
    @SuppressLint("InlinedApi")
    private void initView() {
           float length = 0;
           if (mMeasureHeigth >= mMeasureWidth) {
               length = mMeasureWidth;
           } else {
               length = mMeasureHeigth;
           }
           mCircleXY = length / 2;
           mRadius = (float) (length * 0.5 / 2);
           mCirclePaint = new Paint();
          
           //抗锯齿图像边缘相对清晰一点,锯齿痕迹不那么明显
          
           mCirclePaint.setAntiAlias(true);
           //void android.graphics.Paint.setColor(int color)
           mCirclePaint.setColor(getResources().getColor(
            
                   android.R.color.holo_blue_bright));
          
           //绘制弧线
         
           mArcRectF = new RectF(
                   (float) (length * 0.1),
                   (float) (length * 0.1),
                   (float) (length * 0.9),
                   (float) (length * 0.9));
           
           mSweepAngle = (mSweepValue / 100f) * 360f;
           mArcPaint = new Paint();
           mArcPaint.setAntiAlias(true);
           mArcPaint.setColor(getResources().getColor(
                   android.R.color.holo_blue_bright));
        
           //画笔宽度
         
           mArcPaint.setStrokeWidth((float) (length * 0.1));
         
           //字体
         
           mArcPaint.setStyle(Style.STROKE);
        
           //设置text
         
           mShowText = setShowText();
         
           mShowTextSize = setShowTextSize();
           mTextPaint = new Paint();
           mTextPaint.setTextSize(mShowTextSize);
       
           //文字对齐方式
        
           mTextPaint.setTextAlign(Paint.Align.CENTER);
       }
    private float setShowTextSize() {
        this.invalidate();
        return 50;
    }
    private String setShowText() {
        this.invalidate();
        return "Android Skill";
    }
    public void forceInvalidate() {
        this.invalidate();
    }
    //设置状态,调用者不指定具体比例时设置为25
  
    public void setSweepValue(float sweepValue) {
        if (sweepValue != 0) {
            mSweepValue = sweepValue;
        } else {
            mSweepValue = 25;
        }
        this.invalidate();
    }
}

在activity中加载自定义View的方法

package sunny.example.ahthreearc;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.circle_progress);
        //在activity中加载自定义View的方法!!!!!
        ArcView circle = (ArcView) findViewById(R.id.circle);
        circle.setSweepValue(0);
       
        }
    }

布局需要注意包名不能书写错误,<sunny.example.ahthreearc.ArcView/>
否则报错找不到.class文件

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <sunny.example.ahthreearc.ArcView
        android:id="@+id/circle"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 《Android群英传》Three重写View实现全新控件弧线展示图_第1张图片

你可能感兴趣的:(《Android群英传》Three重写View实现全新控件弧线展示图)