欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android打造炫酷進(jìn)度條效果

 更新時間:2021年09月27日 14:48:52   作者:569932357  
這篇文章主要為大家詳細(xì)介紹了Android打造炫酷進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android炫酷進(jìn)度條效果的具體代碼,供大家參考,具體內(nèi)容如下

學(xué)習(xí):視頻地址

HorizontalProgressbarWithProgress的代碼

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ProgressBar;

import trunk.doi.base.R;

/**
 * 作者:Mr.Lee on 2017-10-17 15:51
 * 郵箱:569932357@qq.com
 */

public class HorizontalProgressbarWithProgress extends ProgressBar{

 private static final int DEFAULT_TEXT_SIZE=10;//sp
 private static final int DEFAULT_TEXT_COLOR=0xFFFC00D1;
 private static final int DEFAULT_COLOR_UNREACH=0xFFD3D6DA;
 private static final int DEFAULT_HEIGHT_UNREACH=2;//dp
 private static final int DEFAULT_COLOR_REACH=DEFAULT_TEXT_COLOR;
 private static final int DEFAULT_HEIGHT_REACH=2;
 private static final int DEFAULT_TEXT_OFFSET=10;

 protected int mTextSize=sp2px(DEFAULT_TEXT_SIZE);
 protected int mTextColor=DEFAULT_TEXT_COLOR;
 protected int mUnReachColor=DEFAULT_COLOR_UNREACH;
 protected int mUnReachHeigh=dp2px(DEFAULT_HEIGHT_UNREACH);
 protected int mReachHeigh=dp2px(DEFAULT_HEIGHT_REACH);
 protected int mReachColor=DEFAULT_COLOR_REACH;
 protected int mTextOffset=dp2px(DEFAULT_TEXT_OFFSET);

 protected Paint mPaint=new Paint();
 protected int mRealWidth;

 public HorizontalProgressbarWithProgress(Context context) {
  super(context);
  init(null);
 }

 public HorizontalProgressbarWithProgress(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(attrs);

 }

 public HorizontalProgressbarWithProgress(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init(attrs);
 }

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public HorizontalProgressbarWithProgress(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);
  init(attrs);
 }
 private void init(AttributeSet attrs) {


  /**
   * 獲取dimension的方法有幾種,區(qū)別不大
   * 共同點是都會將dp,sp的單位轉(zhuǎn)為px,px單位的保持不變
   *
   * getDimension() 返回float,
   * getDimensionPixelSize 返回int 小數(shù)部分四舍五入
   * getDimensionPixelOffset 返回int,但是會抹去小數(shù)部分
   */
  TypedArray array=getContext().obtainStyledAttributes(attrs, R.styleable.HorizontalProgressbarWithProgress);

  mTextSize= (int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_text_size,mTextSize);
  mTextColor=array.getColor(R.styleable.HorizontalProgressbarWithProgress_progress_text_color,mTextColor);
  mUnReachColor=array.getColor(R.styleable.HorizontalProgressbarWithProgress_progress_unreach_color,mUnReachColor);
  mUnReachHeigh=(int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_unreach_height,mUnReachHeigh);
  mReachHeigh=(int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_reach_height,mReachHeigh);
  mTextOffset=(int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_text_offset,mTextOffset);
  mReachColor=array.getColor(R.styleable.HorizontalProgressbarWithProgress_progress_reach_color,mReachColor);

  array.recycle();

  mPaint.setTextSize(mTextSize);

 }

 @Override
 protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//  int widthMode=MeasureSpec.getMode(widthMeasureSpec);
  int width=MeasureSpec.getSize(widthMeasureSpec);
  int heigh=measureHeight(heightMeasureSpec);
  setMeasuredDimension(width,heigh);
  mRealWidth=getMeasuredWidth()-getPaddingLeft()-getPaddingRight();
 }



 private int measureHeight(int heightMeasureSpec) {

  int result=0;
  int mode=MeasureSpec.getMode(heightMeasureSpec);
  int size=MeasureSpec.getSize(heightMeasureSpec);

  if(mode==MeasureSpec.EXACTLY){
   result=size;
  }else{
   int textHeigh= (int) (mPaint.descent()-mPaint.ascent());
   result=getPaddingTop()+getPaddingBottom()+Math.max(Math.max(mReachHeigh,mUnReachHeigh),Math.abs(textHeigh));
   if(mode==MeasureSpec.AT_MOST){
    result=Math.min(result,size);
   }
  }
  return result;

 }

 @Override
 protected synchronized void onDraw(Canvas canvas) {


  canvas.save();
  canvas.translate(getPaddingLeft(),getHeight()/2);

  boolean noNeedUnReach=false;
  String text=getProgress()+"%";
  int textWidth= (int) mPaint.measureText(text);
  float radio =getProgress()*1.0f/getMax();
  float progressX=radio*mRealWidth;
  if(progressX+textWidth>mRealWidth){
   progressX=mRealWidth-textWidth;
   noNeedUnReach=true;
  }

  float endX=progressX-mTextOffset/2;
  if(endX>0){
   mPaint.setColor(mReachColor);
   mPaint.setStrokeWidth(mReachHeigh);
   canvas.drawLine(0,0,endX,0,mPaint);
  }

  //draw text
  mPaint.setColor(mTextColor);
  int y = (int) (-(mPaint.descent()+mPaint.ascent())/2);
  canvas.drawText(text,progressX,y,mPaint);


  //draw unreach bar
  if(!noNeedUnReach){
   float startX=progressX+ mTextOffset/2+textWidth;
   mPaint.setColor(mUnReachColor);
   mPaint.setStrokeWidth(mUnReachHeigh);
   canvas.drawLine(startX,0,mRealWidth,0,mPaint);
  }
  canvas.restore();


 }

 protected int dp2px(int dpVal){
  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal,getResources().getDisplayMetrics());
 }
 protected int sp2px(int spVal){
  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal,getResources().getDisplayMetrics());
 }

}

RoundProgressBarWithProgress的代碼

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;

import trunk.doi.base.R;

/**
 * 作者:Mr.Lee on 2017-10-18 10:48
 * 郵箱:569932357@qq.com
 */

public class RoundProgressBarWithProgress extends HorizontalProgressbarWithProgress {


 private int mRadius=dp2px(30);
 private int mMaxPaintWidth;

 public RoundProgressBarWithProgress(Context context) {
  super(context);
  init(null);
 }

 public RoundProgressBarWithProgress(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(attrs);
 }

 public RoundProgressBarWithProgress(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init(attrs);
 }

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public RoundProgressBarWithProgress(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);
  init(attrs);
 }


 private void init(AttributeSet attrs){

  mReachHeigh= (int) (mUnReachHeigh*2.5f);

  TypedArray array=getContext().obtainStyledAttributes(attrs, R.styleable.RoundProgressBarWithProgress);
  mRadius=(int) array.getDimension(R.styleable.RoundProgressBarWithProgress_radius,mRadius);
  array.recycle();

  mPaint.setStyle(Paint.Style.STROKE);
  mPaint.setAntiAlias(true);
  mPaint.setDither(true);
  mPaint.setStrokeCap(Paint.Cap.ROUND);

 }

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

  mMaxPaintWidth=Math.max(mReachHeigh,mUnReachHeigh);
  //默認(rèn)4個padding一致
  int except=mRadius*2+mMaxPaintWidth+getPaddingLeft()+getPaddingRight();
  int width=resolveSize(except,widthMeasureSpec);
  int height=resolveSize(except,heightMeasureSpec);
  int realWidth=Math.min(width,height);

  mRadius=(realWidth-getPaddingLeft()-getPaddingRight()-mMaxPaintWidth)/2;

  setMeasuredDimension(realWidth,realWidth);
 }

 @Override
 protected synchronized void onDraw(Canvas canvas) {

  String text=getProgress()+"%";
  float textWidth=mPaint.measureText(text);
  float textHeight=(mPaint.ascent()+mPaint.descent())/2;

  canvas.save();
  canvas.translate(getPaddingLeft(),getPaddingTop());

  mPaint.setStyle(Paint.Style.STROKE);
  // draw unreachbar
  mPaint.setColor(mUnReachColor);
  mPaint.setStrokeWidth(mUnReachHeigh);
  canvas.drawCircle(mRadius,mRadius,mRadius,mPaint);
  //draw reach bar
  mPaint.setColor(mReachColor);
  mPaint.setStrokeWidth(mReachHeigh);
  float sweepAngle=getProgress()*1.0f/getMax()*360;
  canvas.drawArc(new RectF(0,0,mRadius*2,mRadius*2),0,sweepAngle,false,mPaint);
  //draw text
  mPaint.setColor(mTextColor);
  mPaint.setStyle(Paint.Style.FILL);
  canvas.drawText(text,mRadius-textWidth/2,mRadius-textHeight,mPaint);

  canvas.restore();

 }
}

activity_view_mv代碼

<?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:id="@+id/rl_view"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
 >


  <trunk.doi.base.ui.activity.test.HorizontalProgressbarWithProgress
   android:id="@+id/progress_bar"
   style="?android:attr/progressBarStyleHorizontal"
   android:layout_marginTop="50dp"
   android:padding="5dp"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:max="100"
   android:progress="50"
   app:progress_unreach_color="@color/pink"
   app:progress_text_color="@color/yellow"
   app:progress_reach_color="@color/red"
   />

  <android.support.v7.widget.AppCompatSeekBar
   android:id="@+id/seekbar"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:padding="5dp"
   android:layout_marginTop="100dp"
   />

  <trunk.doi.base.ui.activity.test.RoundProgressBarWithProgress
   android:id="@+id/progress_bar2"
   style="?android:attr/progressBarStyleHorizontal"
   android:layout_marginTop="150dp"
   android:padding="5dp"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:max="100"
   android:progress="0"
   app:progress_unreach_color="@color/pink"
   app:progress_text_color="@color/yellow"
   app:progress_reach_color="@color/red"
   app:progress_reach_height="3dp"
   app:progress_unreach_height="1dp"
   app:radius="200dp"
   />

</RelativeLayout>

ViewMvActivity代碼

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.AppCompatSeekBar;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.SeekBar;

import butterknife.BindView;
import trunk.doi.base.R;
import trunk.doi.base.base.BaseActivity;

public class ViewMvActivity extends BaseActivity {

 //沒有集成Butterknife的findviewbyid()

 @BindView(R.id.progress_bar)
 HorizontalProgressbarWithProgress progress_bar;
 @BindView(R.id.progress_bar2)
 RoundProgressBarWithProgress progress_bar2;
 @BindView(R.id.seekbar)
 AppCompatSeekBar seekbar;

 private float mTouchStartY;
 private static final float TOUCH_MOVE_MAX_Y=600;

 @Override
 protected int initLayoutId() {
  return R.layout.activity_view_mv;
 }

 @Override
 protected void initView(@Nullable Bundle savedInstanceState) {

 }

 @Override
 protected void setListener() {

  seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
   @Override
   public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    progress_bar.setProgress(progress);
    progress_bar2.setProgress(progress);
   }

   @Override
   public void onStartTrackingTouch(SeekBar seekBar) {

   }

   @Override
   public void onStopTrackingTouch(SeekBar seekBar) {

   }
  });


 }

 @Override
 protected void initData() {

 }


}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android判斷登錄情況

    Android判斷登錄情況

    這篇文章主要介紹了Android判斷登錄情況,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Android實現(xiàn)Path平滑的涂鴉效果實例

    Android實現(xiàn)Path平滑的涂鴉效果實例

    這篇文章主要給大家介紹了關(guān)于Android實現(xiàn)Path平滑涂鴉效果的相關(guān)資料,通過本文介紹的方法修改后會讓線條平滑很多,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • android讀取短信示例分享

    android讀取短信示例分享

    這篇文章主要介紹了android讀取短信示例,需要的朋友可以參考下
    2014-02-02
  • Android編程實現(xiàn)等比例顯示圖片的方法

    Android編程實現(xiàn)等比例顯示圖片的方法

    這篇文章主要介紹了Android編程實現(xiàn)等比例顯示圖片的方法,實例分析了Android等比例縮放圖片的具體步驟與相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • android獲取照片的快照 思路及實現(xiàn)方法

    android獲取照片的快照 思路及實現(xiàn)方法

    android獲取照片的快照 思路及實現(xiàn)方法,需要的朋友可以參考一下
    2013-06-06
  • Android程序開發(fā)之Fragment實現(xiàn)底部導(dǎo)航欄實例代碼

    Android程序開發(fā)之Fragment實現(xiàn)底部導(dǎo)航欄實例代碼

    流行的應(yīng)用的導(dǎo)航一般分為兩種,一種是底部導(dǎo)航,一種是側(cè)邊欄。本文給大家介紹Fragment實現(xiàn)底部導(dǎo)航欄,對Fragment實現(xiàn)底部導(dǎo)航欄相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • 規(guī)避Android開發(fā)中內(nèi)存泄漏陷阱的解決方案

    規(guī)避Android開發(fā)中內(nèi)存泄漏陷阱的解決方案

    在Android開發(fā)中,內(nèi)存泄漏是一個常見但容易被忽視的問題,它會導(dǎo)致應(yīng)用程序占用過多的內(nèi)存資源,最終影響應(yīng)用的性能和用戶體驗,本文將深入探討Android常見的內(nèi)存泄漏問題,并提供優(yōu)化指南,需要的朋友可以參考下
    2024-05-05
  • Android開發(fā)中的重力傳感器用法實例詳解

    Android開發(fā)中的重力傳感器用法實例詳解

    這篇文章主要介紹了Android開發(fā)中的重力傳感器用法,簡單分析了Android重力傳感器的基本功能、使用方法,并結(jié)合實例形式分析了Android基于重力傳感器實現(xiàn)橫豎屏切換的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Android PickerView滾動選擇器的使用方法

    Android PickerView滾動選擇器的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android PickerView滾動選擇器的使用方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 藍(lán)牙原理Android代碼實現(xiàn)

    藍(lán)牙原理Android代碼實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了藍(lán)牙原理Android代碼實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論