// -------------核心类-------------------------

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ProgressBar;

public class HProgress extends ProgressBar {
    private static final String TAG="HProgress";
    private static final int DEFAULT_TEXT_SIZE = 10;
    private static final int DEFAULT_TEXT_COLOR = 0xfffc00d1;
    private static final int DEFAULT_UNREACH_COLOR = 0xffd3d6da;
    private static final int DEFAULT_REACH_COLOR = DEFAULT_TEXT_COLOR;
    private static final int DEFAULT_TEXT_OFFSET = 10;
    private static final int DEFAULT_REACH_HEIGHT = 2;
    private static final int DEFAULT_UNREACH_HEIGHT = 300;

private int mTextSize = 0;
    private int mTextColor = DEFAULT_TEXT_COLOR;
    private int mUnReachColor = DEFAULT_UNREACH_COLOR;
    private int mReachColor = DEFAULT_REACH_COLOR;
    protected int mReachHeight = DEFAULT_REACH_HEIGHT;
    protected int mUnReachHeight = DEFAULT_UNREACH_HEIGHT;
    private int mTextOffset = DEFAULT_TEXT_OFFSET;
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private int mRealWidth = 0;
    private boolean mNoNeedUnReach;

public HProgress(Context context) {
        this(context, null);
        mTextSize = dip2px(context, DEFAULT_TEXT_SIZE * 1.0f);
    }

public HProgress(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

public HProgress(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = null;
        a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HProgress, defStyleAttr, 0);

mTextSize = a.getDimensionPixelSize(R.styleable.HProgress_text_size, mTextSize);
        mTextColor = a.getColor(R.styleable.HProgress_text_color, mTextColor);
        mReachColor = a.getColor(R.styleable.HProgress_reach_color, mReachColor);
        mReachHeight = a.getDimensionPixelSize(R.styleable.HProgress_reach_height, mReachHeight);
        mUnReachColor = a.getColor(R.styleable.HProgress_unreach_color, mUnReachColor);
        mUnReachHeight = a.getDimensionPixelSize(R.styleable.HProgress_unreach_height, mUnReachHeight);
        Log.d(TAG,"mUnReachHeight111 "+mUnReachHeight);
        mTextOffset = a.getDimensionPixelOffset(R.styleable.HProgress_text_offset, mTextOffset);
        a.recycle();
        mPaint.setTextSize(mTextSize);

}

@Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width=MeasureSpec.getSize(widthMeasureSpec);
        int heights = measureHeight(heightMeasureSpec);
        setMeasuredDimension(width,heights);
        mRealWidth=getMeasuredWidth()-getPaddingLeft()-getPaddingRight();
    }

private int measureHeight(int heightMeasureSpec) {
        int result = 0;
        int mode = MeasureSpec.getMode(heightMeasureSpec);
        int size = MeasureSpec.getSize(heightMeasureSpec);
        Log.d(TAG,"size "+size);
        if (mode == MeasureSpec.EXACTLY) {
            result = size;
        }else {
                int textHeight= (int) (mPaint.descent()-mPaint.ascent());
                Log.d(TAG,"mUnReachHeight222 "+mUnReachHeight);
                result=getTop()+getBottom()+Math.max(Math.max(mReachHeight,mUnReachHeight),Math.abs(textHeight));
                Log.d(TAG,"result11 "+result);
            if(mode==MeasureSpec.AT_MOST) {
                result=Math.min(result,size);
                Log.d(TAG,"result22 "+result);
            }
        }
        Log.d(TAG,"result33 "+result);
        return result;
    }

@Override
    protected synchronized void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        canvas.translate(getPaddingLeft(),getHeight()/2);

boolean mNoNeedUnReach= false;
        String text=getProgress()+"%";
      // int textWidth= (int) mPaint.measureText(text);
        Rect rect=new Rect();
        mPaint.getTextBounds(text,0,text.length(),rect);
        int textWidth=rect.width();
        Log.d(TAG,"textWidth2 "+textWidth);
        float scale=getProgress()*1.0f/getMax();
        float endX=0;
        if(scale*mRealWidth+textWidth<mRealWidth){

endX=scale*mRealWidth-mTextOffset/2-textWidth/2;
        }else {
            endX=mRealWidth-textWidth;
        }

if(endX>0){
           mPaint.setColor(mReachColor);
           mPaint.setStrokeWidth(mReachHeight);
           canvas.drawLine(0,0,endX,0,mPaint);
       }
        float progressX=scale*mRealWidth;
        if(progressX+textWidth>mRealWidth){
            progressX=mRealWidth-textWidth;
            endX=progressX;
            mNoNeedUnReach=true;
        }
       mPaint.setColor(mTextColor);
       int y= rect.height()/2;
       canvas.drawText(text,endX,y,mPaint);
       if(!mNoNeedUnReach){
           float start=progressX+mTextOffset/2+textWidth/2;
           mPaint.setColor(mUnReachColor);
           canvas.drawLine(start,0,mRealWidth,0,mPaint);
       }
        canvas.restore();
    }

/**
     * 将dp转换成px
     *
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

/**
     * 将像素转换成dp
     *
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

}

/-------------------自定义属性---------------------------------

<?xml version="1.0" encoding="utf-8"?>
<resources><attr name="textSize" format="dimension"></attr><attr name="textColor" format="color"></attr><declare-styleable  name="HuaWeiCircle"><attr name="outColor" format="color"></attr><attr name="outRadius" format="dimension"></attr><attr name="lineColor"  format="color"></attr><attr name="lineHeight"  format="dimension"></attr><attr name="progress"  format="integer"></attr><attr name="textSize" ></attr><attr name="textColor" ></attr></declare-styleable></resources>

----------------------------------使用----------------------------------------------

package com.recyclerview.zhangxiaoqing;import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private final String TAG="MainActivity";private final int MSG = 100;private final int MSG_END = 101;private final int MSG_1 = 102;private int aaa=1;private Handler mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {if(msg.what==MSG_END){mHuaWeiCircle.setState(true);mHuaWeiCircle.endAnimator();}else  if(msg.what==MSG_1){for (int i = aaa; i <101 ; i++) {Log.d(TAG,"AAA "+aaa);if (aaa >= 100) {/* mHandler.sendEmptyMessageDelayed(MSG_END,0);mHandler.removeMessages(MSG_1);*/mHandler.removeMessages(MSG_1);mHandler.sendEmptyMessageDelayed(MSG_END,100);}else {mHuaWeiCircle.setProgress(++aaa);mHandler.sendEmptyMessageDelayed(MSG_1,100);break;}}}return true;}});private RecyclerView mRecyclerView;private List<String> mList = new ArrayList<>();private CircleLoadingView mCircleLoadingView;private HuaWeiCircle mHuaWeiCircle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initHuaWei();}private void initHuaWei() {mHuaWeiCircle = findViewById(R.id.huawei);/*mHuaWeiCircle.setProgress(80);mHuaWeiCircle.setIsStartAnimator(false);*/mHuaWeiCircle.startAnimator();mHuaWeiCircle.setProgress(30);mHandler.sendEmptyMessageDelayed(MSG_1,0);}}

模仿华为手机管家圆形刻度相关推荐

  1. 仿华为手机管家“一键优化”Loading加载框

    仿华为手机管家"一键优化"Loading加载框 最近公司项目版本通过了没事做,闲来无聊学习下自定义view知识.偶尔看到华为手机上面的手机管家应用上面的loading图,于是想模仿 ...

  2. android10禁用华为桌面,[原创]简单分析华为emui10对第三方桌面的禁用逻辑(华为手机管家app) + 求助新rom的分析入手思路...

    华为开启emui10的公测后, 之前一直禁止切换默认launcher的情况有了新的解决办法 : 冻结 手机管家 即可设置 第三方launcher 这里简单分析华为手机管家中 相关逻辑 求助: 在 最新 ...

  3. a.gray.PiggyGoldcoin.a被手机管家报病毒

    最近华为手机管家报错,无法安装apk,报a.gray.PiggyGoldcoin.a病毒错误,没加固的apk不报错 最后显然是加固的问题,一步一步排查,最后加固只保留了x86支持和签名校验,其他的多余 ...

  4. 鸿蒙有没有手机管家,鸿蒙2.0手机快了,华为EMUI 11透露关键信息

    鸿蒙2.0手机快了,华为EMUI 11透露关键信息是由电脑报的小编精心推荐,希望以下资讯对你能带来参考借鉴作用. 在9月10日的华为2020开发者大会上,华为正式发布了鸿蒙2.0操作系统,并第一次明确 ...

  5. Android 针对华为手机调用裁剪出现圆形裁剪框的处理

    Android 针对华为手机调用裁剪出现圆形裁剪框的处理 if (Build.MANUFACTURER.equals("HUAWEI")) {intent.putExtra(&qu ...

  6. 华为电脑管家不显示“我的设备”选项,只有“我的手机”选项

    电脑版本: Huawei MateBook D 2018 华为电脑管家版本(破解): 11.1.1.95(C233DO55) 问题描述: 华为电脑管家不显示"我的设备"选项,只有& ...

  7. android自定义View之(六)------高仿华为荣耀3C的圆形刻度比例图(ShowPercentView)

    为什么写这篇文章: 显示当前的容量所占的比例,表现当前计划的进度,一般都会采用百分比的方式,而图形显示,以其一目了然的直观性和赏心悦目的美观形成为了我们的当然的首选. 在图形表示百分比的方法中,我们有 ...

  8. 没有提示_华为手机发出莫名的提示音,打开什么也没有?原来是它们在作怪

    不知道你们有没有遇到过这样的情况,在使用手机的过程中会出现一个非常奇怪的现象:当你听到手机发出声音,打开手机却发现什么通知也没有?这一度让我感到很困扰,本着"打破砂锅问到底"的精神 ...

  9. 华为手机怎么看图片属性_华为手机音量小怎么办

    有的时候在使用华为手机打电话或者看电影听音乐的过程中,经常会发生手机声音过小的情况,那么,华为手机音量小怎么办?下面将会为大家介绍一下详细的解决方法. 华为手机音量小怎么办 1.点击打开华为手机的拨号 ...

最新文章

  1. js获取html代码中所有图片地址
  2. 简单介绍C++中常量与指针
  3. #Ubuntu 18.04 安装tensorflow-gpu 1.9
  4. 20170125小测
  5. 并不对劲的loj2179:p3714:[BJOI2017]树的难题
  6. 判别器loss为0_TensorFlow v2.0实现逻辑斯谛回归
  7. enspac启动失败代码2_电脑蓝屏代码0x000024
  8. dp - 2016腾讯笔试 A
  9. 网络管理与维护作业4
  10. Windows 使用windump进行循环抓包
  11. 清晨晓叙:matlab中的矩阵拼接
  12. jdk LinkedHashMap源码分析
  13. python新浪微博爬虫_利用新浪API实现数据的抓取\微博数据爬取\微博爬虫
  14. 僵尸网络 DDoS 攻击活动分析
  15. 2008-03-31 雨纷飞
  16. Mac 连接显示器,外接显示器不出影像
  17. 淘宝奇门对接(淘宝订单加密改造)
  18. java输入输出流数组_详解Java中ByteArray字节数组的输入输出流的用法
  19. vue + elementui table 列内容相同 自动合并单元格 完整代码
  20. servlet的生命周期的介绍

热门文章

  1. HTML:初次见面,先做个自我介绍
  2. 2023年 团体程序设计天梯赛个人感悟及总结(附题解)——遗憾国三
  3. 计算机科学与系统科学的关系,计算机科学与技术中的系统论与辩证法.doc
  4. 机器学习算法基础概念学习总结(转载)
  5. 北京市2021年高考适应性测试成绩查询,教育局2021适应性考试成绩查询
  6. 【项目】小帽学堂(三)
  7. 【直通华为HCNA/HCNP系列R篇-12】BGP路由配置与管理-王达-专题视频课程
  8. linux中数字进制转换
  9. 基于C语言实现的关键字检索系统
  10. 皮肤下载php,phpstrom好看的皮肤