Skip to content

BgButton

工作中遇到一个难题

有个进度条显示效果要求进度按照比例计算,但是文字显示效果和背景恰好相反,项目中的效果是前人留下的,现实方式非常随意,直接使用大图完成,导致小屏手机无法显示完整图片,大屏手机显示拉伸,英文状态根本没有,后面接手修改适配真是头疼,做成了.9 模式,但是适配依然蛋疼,最后没有办法终于还是准备重写自定 View 来完成效果。

最终的效果如下: progress

实战演练

下面简要描述下代码的实现,主要分为两个部分,第一个为文字显示效果。第二个为背景显示效果。

文字显示 Progress.java

java
public class Progress extends TextView {
    public Progress(Context context) {
        super(context);
        init();
    }
    public Progress(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public Progress(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
//        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }
    private LinearGradient mLinearGradient;
    private Matrix mGradientMatrix;
    private Paint mPaint;
    private int mViewWidth = 0;
    private int mTranslate = 0;
    private boolean mAnimating = true;
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    /**
     * progress 取值范围 (0-100)
     */
    public void setProgress(int progress){
        mPaint = getPaint();
        mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
        if(progress <= 0){
            //白底红字 so paint not set shader, and setColor = Color.parseColor("#f05858")
            mPaint.setColor(Color.parseColor("#f05858"));
            setTextColor(Color.parseColor("#f05858"));
            setText("开始下载");
        }else if(progress >= 100){
            //红底白字
            mPaint.setColor(Color.WHITE);
            setTextColor(Color.WHITE);
            setText("再次下载");
        }else{
            final float precent = (float) progress/100f;
            mLinearGradient = new LinearGradient(0, 0, getWidth(), 0,
                    new int[]{ Color.WHITE, Color.WHITE,Color.parseColor("#f05858"), Color.parseColor("#f05858")},
                    new float[]{0, precent, precent, 1}, Shader.TileMode.MIRROR);
            mPaint.setShader(mLinearGradient);
            setText("继续下载");
        }
        postInvalidateDelayed(50);
    }
}

背景显示 ProgressBg.java

java

public class ProgressBg extends View {

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

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

    public ProgressBg(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }
    private LinearGradient mLinearGradient;
    private Paint mPaint;
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        setBackgroundColor(Color.WHITE);
        mPaint.setColor(Color.parseColor("#f05858"));
        canvas.drawRect(0f, 0f, getWidth()*precent, getHeight(), mPaint);
        invalidate();
    }
    public float precent = 0.0f;
    /**
     * progress 取值范围 (0-100)
     */
    public void setProgress(int progress){
        Log.i("precent","precent:"+precent);
        if(progress <= 0){
            //白底红字 so paint not set shader, and setColor = Color.parseColor("#f05858")
            precent = 0.0f;
        }else if(progress >= 100){
            //红底白字
            precent = 1.0f;
        }else{
            precent = (float) progress/100f;

        }
        invalidate();

    }
}

调用方法 demo.xml

xml
<FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <com.nostra13.universalimageloader.sample.ProgressBg
                android:layout_width="match_parent"
                android:id="@+id/progress_bg"
                android:layout_height="40dp"
                android:minHeight="40dp" />

            <com.nostra13.universalimageloader.sample.Progress
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:id="@+id/progress_1"
                android:gravity="center"
                android:minHeight="30dp"
                android:text="再次学习"
                android:textSize="30sp" />
        </FrameLayout>

调用方法 Demo.java

java
 Handler mHandler = new Handler();
    int progress_value = 0;
    Runnable setProgress = new Runnable() {
        @Override
        public void run() {
            if (progress_value > 100) {
                progress_value = 0;
            }
            progress.setProgress(progress_value);
            progressBg.setProgress(progress_value);
            progress_value = progress_value + 2;
            mHandler.postDelayed(this, 1000L);
        }
    };