Android中怎么自定義Progress控件,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)公司于2013年開(kāi)始,先為河津等服務(wù)建站,河津等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為河津企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
主要就是需求就是橢圓進(jìn)度,百分比跟隨漸變背景,這樣一想其實(shí)就是一個(gè)布局,然后控制里面的進(jìn)度長(zhǎng)度,或者移動(dòng),我這是控制長(zhǎng)度,這樣畢竟簡(jiǎn)單,而且擴(kuò)展好,以后進(jìn)度條有什么奇葩需求也好改。
import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.support.annotation.AttrRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; /** * Created by LiuZhen on 2017/7/8. */ public class UpdateProgressBar extends FrameLayout { private TextView tv_progress; private int width; private ViewGroup.LayoutParams params; /** * The progress text offset. */ private int mOffset; /** * The progress text size. */ private float mTextSize; /** * The progress text color. */ private int mTextColor; private float default_text_size; /** * The progress area bar color. */ private int mReachedBarColor; /** * The bar unreached area color. */ private int mUnreachedBarColor; private final int default_reached_color = Color.rgb(66, 145, 241); private final int default_unreached_color = Color.rgb(204, 204, 204); private final int default_text_color = Color.rgb(66, 145, 241); public UpdateProgressBar(@NonNull Context context) { this(context,null); } public UpdateProgressBar(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public UpdateProgressBar(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int desiredWidth = 100; int desiredHeight = 100; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int height; //Measure Width if (widthMode == MeasureSpec.EXACTLY) { //Must be this size width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { //Can't be bigger than... width = Math.min(desiredWidth, widthSize); } else { //Be whatever you want width = desiredWidth; } //Measure Height if (heightMode == MeasureSpec.EXACTLY) { //Must be this size height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { //Can't be bigger than... height = Math.min(desiredHeight, heightSize); } else { //Be whatever you want height = desiredHeight; } int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); ViewGroup.LayoutParams lp = child.getLayoutParams(); int childWidthSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width); int childHeightSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height); child.measure(childWidthSpec, childHeightSpec); } params = tv_progress.getLayoutParams(); params.width = ViewGroup.LayoutParams.WRAP_CONTENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; tv_progress.setLayoutParams(params); height = tv_progress.getMeasuredHeight(); //MUST CALL THIS setMeasuredDimension(width, height); } private void init(AttributeSet attrs, int defStyleAttr){ default_text_size = 8; //load styled attributes. final TypedArray attributes = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.UpdateProgressBar, defStyleAttr, 0); mTextSize = attributes.getDimension(R.styleable.UpdateProgressBar_update_text_size, default_text_size); mReachedBarColor = attributes.getResourceId(R.styleable.UpdateProgressBar_update_reached_color, default_reached_color); mUnreachedBarColor = attributes.getResourceId(R.styleable.UpdateProgressBar_update_unreached_color, default_unreached_color); mTextColor = attributes.getColor(R.styleable.UpdateProgressBar_update_text_color, default_text_color); setDefaultProgressBar(); mOffset = px2dip(3); attributes.recycle(); } private void setDefaultProgressBar(){ setBackgroundResource(mUnreachedBarColor); tv_progress = new TextView(getContext()); tv_progress.setTextSize(mTextSize); tv_progress.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); tv_progress.setTextColor(mTextColor); tv_progress.setLines(1); tv_progress.setBackgroundResource(mReachedBarColor); tv_progress.setPadding(0,0,5,1); tv_progress.setText("0%"); addView(tv_progress); } public void setProgress(int progress){ tv_progress.setText(progress+"%"); int proWidth = width*progress/100; if (tv_progress.getWidth() < proWidth) params.width = proWidth;//這里不能填充mOffset,因?yàn)槭菣E圓進(jìn)度條,填充會(huì)導(dǎo)致橢圓寬度被進(jìn)度條覆蓋,導(dǎo)致不美觀 tv_progress.setLayoutParams(params); } /** * 根據(jù)手機(jī)的分辨率從 dp 的單位 轉(zhuǎn)成為 px(像素) */ public int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根據(jù)手機(jī)的分辨率從 px(像素) 的單位 轉(zhuǎn)成為 dp */ public int px2dip(float pxValue) { final float scale = getContext().getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 將px值轉(zhuǎn)換為sp值,保證文字大小不變 */ public int px2sp(float pxValue) { final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * 將sp值轉(zhuǎn)換為px值,保證文字大小不變 */ public int sp2px(float spValue) { final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } }
用法布局文件
MainActivity
import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.progressbar.NumberProgressBar; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { private Timer timer; private UpdateProgressBar progressBar; private int progress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressBar = (UpdateProgressBar)findViewById(R.id.progress); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { progress++; progressBar.setProgress(progress); if(progress == 100) { Toast.makeText(getApplicationContext(), getString(R.string.finish), Toast.LENGTH_SHORT).show(); // progress = 0; // progressBar.setProgress(0); timer.cancel(); } } }); } }, 1000, 100); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { super.onDestroy(); timer.cancel(); } }
漸變背景
關(guān)于Android中怎么自定義Progress控件問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。