您的位置:首页 > 移动开发 > Android开发

Android自定义progress

2015-11-09 18:18 369 查看
转载请标明出处:http://blog.csdn.net/u013598111/article/details/49742145,本文出自:【JunTao_sun】



自定义属性

<?xml version="1.0" encoding="utf-8"?>

<span style="font-size:18px;"><resources>
<declare-styleable name="MyView">
<attr name="color" format="color" />
<attr name="color_r" format="color" />
</declare-styleable>
</resources>
</span>

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:progress="http://schemas.android.com/apk/res/com.example.customsProgress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<com.example.customsProgress.ProgressView
android:id="@+id/ProgressView1"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:padding="40dp"
progress:color_r="#ffff0000"
progress:color="#ff0000ff" />

<com.example.customsProgress.ProgressView
android:id="@+id/ProgressView2"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:padding="40dp"
progress:color_r="#ffff0000"
progress:color="#ff0000ff" />

<com.example.customsProgress.ProgressView
android:id="@+id/ProgressView3"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:padding="40dp"
progress:color_r="#ffff0000"
progress:color="#ff0000ff" />

<com.example.customsProgress.ProgressView
android:id="@+id/ProgressView4"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:padding="40dp"
progress:color_r="#ffff0000"
progress:color="#ff0000ff" />

</LinearLayout></span>

<span style="font-size:18px;">package com.example.customsProgress;

import java.util.Random;

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

public class ProgressView extends ProgressBar {

private static final String TAG = "ProgressView";
private int paddingLT = 3;
private int paddingRT = 3;
private Paint paint;
private Rect mbound;
private int textWidth;
private int textHeight;
private int mRealWidth;
private int heightMeasureSpe;
private Paint rightPaint;
private Paint textPaint;

public ProgressView(Context context) {
this(context, null);
// TODO Auto-generated constructor stub
}

public ProgressView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}

public ProgressView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);

TypedArray a = context
.obtainStyledAttributes(attrs, R.styleable.MyView);
int progressColor = a.getColor(R.styleable.MyView_color, 0Xff0000ff);
int progressColor_r = a
.getColor(R.styleable.MyView_color_r, 0Xff0000ff);

a.recycle();
int bar = getProgress();
textPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setDither(true);
textPaint.setColor(0xff00ff00);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
rightPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
rightPaint.setColor(progressColor_r);
paint.setStyle(Style.FILL);
paint.setColor(progressColor);
mbound = new Rect();
// 测量初始高度
measureText(bar + "");

}

@Override
protected synchronized void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int w = 0;
int h = 0;
switch (modeWidth) {
case MeasureSpec.EXACTLY:
w = width;
Log.e(TAG, "getMeasuredWidth()" + getMeasuredWidth());

break;
case MeasureSpec.AT_MOST:

case MeasureSpec.UNSPECIFIED:
w = getMeasuredWidth() + getPaddingLeft() + getPaddingRight();

break;

}
// 控制MeasureSpec.AT_MOST 最大不能超出的范围
w = modeWidth == MeasureSpec.AT_MOST ? Math.min(w, width) : w;

switch (modeHeight) {
case MeasureSpec.EXACTLY:
h = height;

break;
case MeasureSpec.AT_MOST:

case MeasureSpec.UNSPECIFIED:

h = (int) ((-paint.ascent() + paint.descent()) + getPaddingTop() + getPaddingBottom());
break;
}
h = modeHeight == MeasureSpec.AT_MOST ? Math.min(h, height) : h;

setMeasuredDimension(w, h);

}

/**
* 测量 progress字体宽高
*
* @param text
*/
private void measureText(String text) {
textPaint.getTextBounds(text, 0, text.length(), mbound);
textWidth = (int) textPaint.measureText(text);
FontMetrics fm = textPaint.getFontMetrics();
textHeight = (int) (fm.descent + fm.ascent);

}

private int mRight;
private int mLeft;
private int mRealText;
private int mLineHeight;
private int mTextHeight;

@Override
protected synchronized void onDraw(Canvas canvas) {

super.onDraw(canvas);
// 判断是否到达右末端
boolean isFinishRight = false;
canvas.save();
// 获取进度
int progress = getProgress();
// 0~1 速率 *1.0f先 不然会都等于0
float rate = progress * 1.0f / getMax();
// 不断累加
float start = (mRealWidth - textWidth - paddingLT * 2) * rate;
String text = progress + "%";
measureText(text);
// 右边长度变化
mRight = (int) (start + textWidth + paddingLT * 2 + getPaddingLeft());
// 左边长度变化
mLeft = (int) (start + getPaddingLeft());
// text 加上两个gap的实际宽度
mRealText = textWidth + paddingLT * 2;
// 线的实际高度
mLineHeight = -textHeight / 2 + getPaddingTop();
// 字体的高度
mTextHeight = -textHeight + getPaddingTop();

// 判断未画的线 是不是到达 到达就把最变量start值 赋给最大值
if (start + textWidth + paddingLT * 2 > mRealWidth) {
start = mRealWidth;
// 控制是否继续画
isFinishRight = true;
}
if (!isFinishRight) {
// 画右边线条
drawRight(canvas);

}
// 标志 是否大于等于实际宽度
float endX = start + textWidth + paddingLT * 2;
if (endX >= mRealWidth) {
// left 的最点位子,不再继续画
start = mRealWidth - textWidth - paddingLT * 2;
drawLeft(canvas, start);

} else {
// 不满足前面条件 则不断加上去
drawLeft(canvas, start);
}

// 画进度  要判断endX也行  有点麻烦了
drawText(canvas, text);

canvas.restore();
}

/**
* @param canvas
* @param start
*            左侧进度
*/
private void drawRight(Canvas canvas) {

canvas.drawLine(mLeft + mRealText, mLineHeight, mRealWidth
+ getPaddingLeft(), mLineHeight, rightPaint);

}

private void drawLeft(Canvas canvas, float start) {

canvas.drawLine(getPaddingLeft(), mLineHeight, mLeft, mLineHeight,
paint);

}

private void drawText(Canvas canvas, String text) {

canvas.drawText(text, mLeft + paddingLT, mTextHeight, textPaint);

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);
// 实际长度
mRealWidth = w - getPaddingLeft() - getPaddingRight();

}

/**
* dp 2 px
*
* @param dpVal
*/
protected int dp2px(int dpVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dpVal, getResources().getDisplayMetrics());
}

/**
* sp 2 px
*
* @param spVal
* @return
*/
protected int sp2px(int spVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
spVal, getResources().getDisplayMetrics());

}
String[]  colors=new String[]{"#fe9d01",
"#fe9d01",
"#ffbb1c",
"#eed205",
"#ff8c05",
"#ff6600",
"#ffa500"
};
Random random=new Random();
//改变画笔颜色
public void updataPaintColors(){
this.paint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
this.textPaint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
this.rightPaint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));

//	    int i=random.nextInt(colors.length);
//		this.paint.setColor(Color.parseColor(colors[i]));
//		int j=	random.nextInt(colors.length);
//		this.rightPaint.setColor(Color.parseColor(colors[j]));
}

}
</span>

<span style="font-size:18px;">package com.example.customsProgress;

import android.R.integer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.renderscript.Sampler.Value;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
private static final int SEND_PROGRESS1 = 1;
private static final int SEND_PROGRESS2 = 2;
private static final int SEND_PROGRESS3 = 3;
private static final int SEND_PROGRESS4 = 4;
private ProgressView view1, view2, view3, view4;
private Handler handle = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SEND_PROGRESS1:
int progress1 = view1.getProgress();
view1.updataPaintColors();
view1.setProgress(++progress1);

if (progress1 <= 100) {
handle.removeMessages(SEND_PROGRESS1);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS1, 40);
break;
case SEND_PROGRESS2:
int progress2 = view2.getProgress();

view2.updataPaintColors();
view2.setProgress(++progress2);

if (progress2 <= 100) {
handle.removeMessages(SEND_PROGRESS2);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS2, 30);
break;
case SEND_PROGRESS3:
int progress3 = view3.getProgress();
view3.updataPaintColors();

view3.setProgress(++progress3);

if (progress3 <= 100) {
handle.removeMessages(SEND_PROGRESS3);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS3, 25);
break;
case SEND_PROGRESS4:
int progress4 = view4.getProgress();
view4.updataPaintColors();

view4.setProgress(++progress4);

if (progress4 <= 100) {
handle.removeMessages(SEND_PROGRESS4);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS4, 45);
break;

}
;

}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view1 = (ProgressView) this.findViewById(R.id.ProgressView1);
view2 = (ProgressView) this.findViewById(R.id.ProgressView2);
view3 = (ProgressView) this.findViewById(R.id.ProgressView3);
view4 = (ProgressView) this.findViewById(R.id.ProgressView4);
Message ms = handle.obtainMessage();
ms.what = SEND_PROGRESS1;
handle.sendMessage(ms);

Message ms1 = handle.obtainMessage();
ms1.what = SEND_PROGRESS2;
handle.sendMessage(ms1);

Message ms2 = handle.obtainMessage();
ms2.what = SEND_PROGRESS3;
handle.sendMessage(ms2);

Message ms3 = handle.obtainMessage();
ms3.what = SEND_PROGRESS4;
handle.sendMessage(ms3);

}

}
</span>
好好学习,天天向上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息