真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中怎么自定義Progress控件

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í)。


當(dāng)前題目:Android中怎么自定義Progress控件
網(wǎng)站路徑:http://weahome.cn/article/gegdpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部