摸鱼学Android 十二(控件2)

UI控件之二

1 ProgressBar(进度条)

1.1 基本属性

  • max:进度条最大值
  • progress:当前进度值
  • progressDrawable:轨道资源图片
  • indeterminate:设置不确定模式,为true则进度条动画无限循环
  • indeterminateDrawable:不确定模式的资源图片
  • indeterminateDuration:不确定模式的持续时间
  • secondaryProgress:二级进度条(比如视频的播放进度和缓冲进度)
  • android:indeterminateBehavior:进度满时的不确定模式表现,[ repeat | cycle ]
  • indeterminateOnly:限制为不确定模式
  • maxHeight:最大高度
  • miniHeight:最小高度
  • maxWidth:最大宽度
  • minWidth:最小宽度

1.2 自定义圆形进度条

  1. 自定义View
public class CirclePgBar extends View {
    //未完成进度
    private Paint mBackPaint;
    //已完成进度
    private Paint mFrontPaint;
    //显示文本
    private Paint mTextPaint;
    //进度条宽度
    private float mStrokeWidth = 50;
    private float mHalfStrokeWidth = mStrokeWidth / 2;
    private float mRadius = 200;
    private RectF mRect;
    private int mProgress = 0;
    //目标值
    private int mTargetProgress = 100;
    private int mMax = 100;
    private int mWidth;
    private int mHeight;

    public CirclePgBar(Context context) {
        super(context);
        init();
    }

    public CirclePgBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CirclePgBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public Paint initPaint(int color) {
        Paint paint = new Paint();
        paint.setColor(color);
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(mStrokeWidth);

        return paint;
    }

    //完成相关参数初始化
    private void init() {
        //未完成进度条
        mBackPaint = initPaint(Color.WHITE);
        //已完成进度条
        mFrontPaint = initPaint(Color.GREEN);
        //文本
        mTextPaint = new Paint();
        mTextPaint.setColor(Color.GREEN);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextSize(80);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
    }

    //重写测量大小的onMeasure方法
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = getRealSize(widthMeasureSpec);
        mHeight = getRealSize(heightMeasureSpec);
        setMeasuredDimension(mWidth, mHeight);
    }

    //重写绘制View的核心方法onDraw()
    @Override
    protected void onDraw(Canvas canvas) {
        initRect();
        float angle = mProgress / (float) mMax * 360;
        canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius, mBackPaint);
        canvas.drawArc(mRect, -90, angle, false, mFrontPaint);
        canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
        if (mProgress < mTargetProgress) {
            mProgress += 1;
            invalidate();
        }
    }

    public int getRealSize(int measureSpec) {
        int mode = MeasureSpec.getMode(measureSpec);
        int size = MeasureSpec.getSize(measureSpec);
        int result = size;

        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {
            result = (int) (mRadius * 2 + mStrokeWidth);
        }

        return result;
    }

    private void initRect() {
        if (mRect == null) {
            mRect = new RectF();
            int viewSize = (int) (mRadius * 2);
            int left = (mWidth - viewSize) / 2;
            int top = (mHeight - viewSize) / 2;
            int right = left + viewSize;
            int bottom = top + viewSize;
            mRect.set(left, top, right, bottom);
        }
    }
}
  1. 加入布局
<com.app.CirclePgBar
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

效果:
在这里插入图片描述

2 SeekBar(拖动条)

2.1 基本属性

SeekBar是ProgressBar子类,属性继承

  • thumb:滑块的资源图片

2.2 监听事件

  • onProgressChanged:进度发生改变时会触发
  • onStartTrackingTouch:按住SeekBar时会触发
  • onStopTrackingTouch:放开SeekBar时触发

3 RatingBar(星级评分条)

3.1 基本属性

RatingBar是ProgressBar,属性继承

  • isIndicator:是否用作指示,用户无法更改,默认false
  • numStars:显示多少个星星,必须为整数
  • rating:默认评分值,必须为浮点数
  • stepSize:评分每次增加的值,必须为浮点数

3.2 监听事件

  • onRatingChanged():评分改变时触发

3.3 自定义星级图标

  1. 替换图片(随便找的)在这里插入图片描述
    在这里插入图片描述
  2. 新建layer-list文件ratingbar_full.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <item android:id="@android:id/background"
          android:drawable="@drawable/blank" />
    <item android:id="@android:id/secondaryProgress"
          android:drawable="@drawable/blank" />
    <item android:id="@android:id/progress"
          android:drawable="@drawable/full" />
</layer-list>
  1. 修改styles.xml
<style name="roomRatingBar" parent="@android:style/Widget.RatingBar">
        <item name="android:progressDrawable">@drawable/ratingbar_full</item>
        <item name="android:minHeight">52dip</item>
        <item name="android:maxHeight">52dip</item>
    </style>
  1. 加入布局
<RatingBar
        android:id="@+id/rb_normal"
        style="@style/roomRatingBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

效果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值