Android自定義圓形進(jìn)度條效果
本文實(shí)例為大家分享了Android自定義圓形進(jìn)度條效果的具體代碼,供大家參考,具體內(nèi)容如下
1 控件 RoundProgress
package listview.tianhetbm.p2p.ui;
import android.content.Context;
import android.content.res.TypedArray;
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.Log;
import android.view.View;
import listview.tianhetbm.p2p.R;
/**
* @date:2015/9/14
* @author:dongxiaogang
* @description: 自定義圓形進(jìn)度條
*/
public class RoundProgress extends View {
private Paint paint = new Paint();
private int roundColor;
private int roundProgressColor;
private int textColor;
private float textSize;
private float roundWidth;
private int max = 100;
private int progress = 50;
public RoundProgress(Context context) {
this(context, null);
}
public RoundProgress(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundProgress);
//圓環(huán)的顏色
roundColor = ta.getColor(R.styleable.RoundProgress_roundColor, Color.RED);
//圓環(huán)進(jìn)度的顏色
roundProgressColor = ta.getColor(R.styleable.RoundProgress_roundProgressColor, Color.GREEN);
//中間進(jìn)度百分比文字字符串的顏色
textColor = ta.getColor(R.styleable.RoundProgress_textColor, Color.GREEN);
//中間進(jìn)度百分比的字符串的字體大小
textSize = ta.getDimension(R.styleable.RoundProgress_textSize, 15);
//圓環(huán)的寬度
roundWidth = ta.getDimension(R.styleable.RoundProgress_roundWidth, 5);
ta.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
//第一步:繪制一個(gè)最外層的圓
paint.setColor(roundColor);
paint.setStrokeWidth(roundWidth);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
int center = getWidth() / 2;
int radius = (int) (center - roundWidth / 2-45);
//canvas.drawCircle(center, center, radius, paint);
RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius);
canvas.drawArc(oval, 135, 270, false, paint);
//第二步:繪制正中間的文本
float textWidth = paint.measureText(progress + "%");
paint.setColor(textColor);
paint.setTextSize(textSize);
paint.setStrokeWidth(0);
canvas.drawText(progress + "%", center - textWidth / 2, center + textSize / 2, paint);
//第三步:
/**
* 參數(shù)解釋?zhuān)?
* oval:繪制弧形圈所包含的矩形范圍輪廓
* 0:開(kāi)始的角度
* 360 * progress / max:掃描過(guò)的角度
* false:是否包含圓心
* paint:繪制弧形時(shí)候的畫(huà)筆
*/
//RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius);
paint.setColor(roundProgressColor);
paint.setStrokeWidth(roundWidth);
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(oval, 135, 270 * progress / max, false, paint);
Log.e("測(cè)試角度",(270 * progress / max)+"");
Paint mp=new Paint();
mp.setAntiAlias(true);
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.tiger);
int bitmapHeight = bitmap.getHeight()/2;
int bitmapWidth = bitmap.getWidth()/2;
//canvas.translate(-center, center);
float y=0f,x=0f;
// if(270 * progress / max<=45){
y = (float) (center-bitmapWidth - (radius) * Math.cos((270 * progress / max+225)*Math.PI/180));
x = (float) (center-bitmapWidth + (radius) * Math.sin((270 * progress / max+225)*Math.PI/180));
// }
//canvas.translate(center, center*2);
Log.e("測(cè)試角度", y + "-----" + x);
canvas.drawBitmap(bitmap, x, y, mp);
}
public void setProgress(int progress){
this.progress = progress;
if(progress>100){
this.progress = 100;
}
postInvalidate();
}
}
2 xml 布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<listview.tianhetbm.p2p.ui.RoundProgress
android:layout_marginTop="30dp"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_marginLeft="10dp"
app:roundColor="@color/back_blue"
app:roundProgressColor="@color/back_orange"
android:id="@+id/ce"
app:roundWidth="10dp"
app:textSize="18sp"
app:textColor="@color/record_red"
/>
</RelativeLayout>
3 activity(主要代碼)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_three);
ButterKnife.bind(this);
new Thread(){
@Override
public void run() {
while (progress<80){
progress+=1;
ce.setProgress(progress);
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二)
我們?cè)趯?shí)際開(kāi)發(fā)中,有的時(shí)候需要儲(chǔ)存或者備份比較復(fù)雜的數(shù)據(jù)。這些數(shù)據(jù)的特點(diǎn)是,內(nèi)容多、結(jié)構(gòu)大,比如短信備份等,通過(guò)本文給大家介紹Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二),對(duì)android數(shù)據(jù)存儲(chǔ)方式相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Android?Studio中使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)登錄和注冊(cè)功能
SQLite是一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它包含在一個(gè)相對(duì)小的C庫(kù)中,下面這篇文章主要給大家介紹了關(guān)于Android?Studio中使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)登錄和注冊(cè)功能的相關(guān)資料,需要的朋友可以參考下2024-06-06
完美解決安卓jni項(xiàng)目會(huì)刪除其他so文件的問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決安卓jni項(xiàng)目會(huì)刪除其他so文件的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Android開(kāi)發(fā)Compose集成高德地圖實(shí)例
這篇文章主要為大家介紹了Android開(kāi)發(fā)Compose里使用高德地圖實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Android SharedPreferences的使用分析
本篇文章小編為大家介紹,Android SharedPreferences的使用分析。需要的朋友參考下2013-04-04
Android EditText被軟鍵盤(pán)遮蓋的處理方法
android app新增了透明欄效果,結(jié)果發(fā)現(xiàn)鍵盤(pán)彈起后會(huì)遮蓋屏幕底部的EditText,沒(méi)有像想象中的調(diào)整窗口大小,并滾動(dòng)ScrollView,將EditText顯示在鍵盤(pán)上方。下面小編把解決方法記錄一下,特此分享到腳本之家平臺(tái),感興趣的朋友一起看看吧2016-10-10
Android編程之selector下設(shè)置背景屬性值的方法
這篇文章主要介紹了Android編程之selector下設(shè)置背景屬性值的方法,結(jié)合實(shí)例形式分析了Android的selector背景選擇器相關(guān)使用技巧,需要的朋友可以參考下2016-01-01

