带有指示器的progressbar

源码下载地址  http://download.csdn.net/detail/lzq520210/9353697

效果如下:


package com.example.demo;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class MainActivity extends Activity {

    private IndiactorView indictorView;
    private int i = 0;
    private Handler handler = new Handler() {

        public void handleMessage(Message msg) {

            indictorView.setPosition(i++);
            if (i <= 100) {

                this.sendEmptyMessageDelayed(0x01, 500);
            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        indictorView = (IndiactorView) findViewById(R.id.indictor_view);

         indictorView.setPosition(i);

        handler.sendEmptyMessageDelayed(0x01, 500);
    }

}




package com.example.demo;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;

/**
 * @author renzhiqiang
 * @function ����ָ����ʾView
 *
 */
public class IndiactorView extends View {

    /**
     * ��������
     */
    private static final int MAX = 100;
    private static final int ROUND_DEGREE = 8;
    private static final int[] cursorColors = new int[] { R.color.color_7ea1de,
            R.color.color_7aa7d6, R.color.color_73adcd, R.color.color_6cb4c4,
            R.color.color_66bbba, R.color.color_63c6a8, R.color.color_63cd99,
            R.color.color_6bce90, R.color.color_7dce8a, R.color.color_96cc84,
            R.color.color_b2c97d, R.color.color_d3c477, R.color.color_e9be72,
            R.color.color_fab76d, R.color.color_ffae68, R.color.color_ff9c60,
            R.color.color_f87653, R.color.color_ff8a5a, R.color.color_f0674e,
            R.color.color_e85548 };
    private Context mContext;
    private Resources res;
    private Paint mPaint;
    private DisplayMetrics dm;
    /**
     * resource
     */
    private Bitmap bitmapProgress;
    private Bitmap bitmapIndictor;

    /**
     * ��������ߣ�����
     */
    private float bitmapProgressWidth, bitmapProgressHeight;
    private float bitmapProgressX, bitmapProgressY;

    private float bitmapIndictorWidth, bitmapIndictorHeight;
    /**
     * �ֻ���Ļ���
     */
    private int screenHeight, screenWidth;

    /**
     * ָʾ���εĿ��
     */
    private int rectWidth;
    private int rectHeight;
    /**
     * ����ָ������
     */
    private int cursorPosition = 0;
    private float precent = 0;
    private String drawText = "0/100";

    public IndiactorView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        this.res = getResources();
        initView();
    }

    private void initView() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        dm = new DisplayMetrics();
        WindowManager wm = (WindowManager) mContext
                .getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(dm);

        screenWidth = dm.widthPixels;
        screenHeight = dm.heightPixels;

        rectWidth = dip2px(47);
        rectHeight = dip2px(25);

        bitmapProgress = BitmapFactory.decodeResource(res,
                R.drawable.progressbar);
        bitmapIndictor = BitmapFactory.decodeResource(res, R.drawable.jintu);

        bitmapProgressWidth = bitmapProgress.getWidth();
        bitmapProgressHeight = bitmapProgress.getHeight();

        bitmapIndictorWidth = bitmapIndictor.getWidth();
        bitmapIndictorHeight = bitmapIndictor.getHeight();

        bitmapProgressX = (screenWidth - bitmapProgressWidth) / 2;
        bitmapProgressY = rectHeight + bitmapIndictorHeight;
    }

    /**
     * �����α�λ��
     *
     * @param position
     */
    public void setPosition(int position) {

        cursorPosition = position;
        precent = (position * bitmapProgressWidth) / MAX;
//        drawText = new StringBuilder().append(position).append("/100")
//                .toString();
        /**
         * ��Ҫ����position����paint��ɫ
         */
        int offset = position / 5;
        if (offset == 20) {
            offset = offset - 1;
        }
        mPaint.setColor(res.getColor(cursorColors[offset]));
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int viewHeight = (int) (bitmapIndictorHeight + bitmapProgressHeight + rectHeight);
        setMeasuredDimension((int) screenWidth, viewHeight);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        /**
         * �α굱ǰX����
         */
        float cursorX = (cursorPosition > 0) ? (bitmapProgressX + precent - bitmapIndictorWidth / 2)
                : (bitmapProgressX + precent);

        canvas.drawBitmap(bitmapProgress, bitmapProgressX, bitmapProgressY,
                null);

        canvas.drawBitmap(bitmapIndictor, cursorX, rectHeight, null);

        /**
         * �߽��жϣ���ֹ������Ļ
         */
        if (cursorX + rectWidth >= screenWidth) {

            cursorX = cursorX - rectWidth + bitmapIndictorWidth;
        }
//        RectF rect = new RectF(cursorX, 0, cursorX + rectWidth, rectHeight - 1);
//        canvas.drawRoundRect(rect, ROUND_DEGREE, ROUND_DEGREE, mPaint);

        mPaint.setColor(Color.WHITE);
        mPaint.setTextSize(dip2px(11));
//        float cursorTextX = (rectWidth - mPaint.measureText(drawText)) / 2;
        float cursorTextY = ((rectHeight / 2) - ((mPaint.descent() + mPaint
                .ascent()) / 2));
//        canvas.drawText(drawText, cursorX + cursorTextX, cursorTextY, mPaint);

    }

    /**
     * �ͷ���Դ���������������ڴ�
     */
    @Override
    protected void onDetachedFromWindow() {

        mContext = null;
        res = null;
        mPaint = null;
        dm = null;
        bitmapIndictor = null;
        bitmapProgress = null;
    }

    /**
     * �����ֻ��ķֱ��ʴ� dp �ĵ�λ ת��Ϊ px(����)
     */
    private int dip2px(float dpValue) {
        return (int) (dpValue * dm.density + 0.5f);
    }
}




<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

  
    <com.example.demo.IndiactorView
        android:id="@+id/indictor_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />
</LinearLayout>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值