Android条纹进度条的实现(调整view宽度仿进度条)

前言

本文主要给大家介绍了关于Android条纹进度条(调整view宽度仿进度条)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

方法如下:

美工同学指定了一个进度条样式

进度条样式

这斑斓的进度条,如果要自己画实在是劳民伤财。于是请美工切了一张素材。

素材样例

如果用shape或者.9图片不太好处理这个条纹。转变思路,放置2张图片。一张作为背景(底,bottom),一张作为进度条图片(cover)。

进度改变时,改变上面图片的宽度。

这就要求上面的图片是圆角的。自定义ImageView,调用canvas.clipPath来切割画布。

public class RoundCornerImageView extends android.support.v7.widget.AppCompatImageView {
 private float mRadius = 18;
 private Path mClipPath = new Path();
 private RectF mRect = new RectF();

 public RoundCornerImageView(Context context) {
 super(context);
 }

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

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

 public void setRadiusDp(float dp) {
 mRadius = dp2px(dp, getResources());
 postInvalidate();
 }

 public void setRadiusPx(int px) {
 mRadius = px;
 postInvalidate();
 }

 @Override
 protected void onDraw(Canvas canvas) {
 mRect.set(0, 0, this.getWidth(), this.getHeight());
 mClipPath.reset(); // remember to reset path
 mClipPath.addRoundRect(mRect, mRadius, mRadius, Path.Direction.CW);
 canvas.clipPath(mClipPath);
 super.onDraw(canvas);
 }

 private float dp2px(float value, Resources resources) {
 return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, resources.getDisplayMetrics());
 }
}

每次绘制都切割一次圆角。记得调用Path.reset()方法。

回到我们要的进度条。布局文件中放置好层叠的图片。

 <RelativeLayout
 android:id="@+id/progress_layout"
 android:layout_width="190dp"
 android:layout_height="10dp"
 android:layout_centerInParent="true">

 <ImageView
  android:id="@+id/p_bot_iv"
  android:layout_width="190dp"
  android:layout_height="10dp"
  android:src="@drawable/shape_round_corner_bottom" />

 <com.rustfisher.view.RoundCornerImageView
  android:id="@+id/p_cover_iv"
  android:layout_width="100dp"
  android:layout_height="10dp"
  android:scaleType="centerCrop"
  android:src="@drawable/pic_cover_blue_white" />

 </RelativeLayout>

需要在代码中动态地改变cover的宽度;dialog中提供如下方法改变LayoutParams

 public void updatePercent(int percent) {
 mPercent = percent;
 mPercentTv.setText(String.format(Locale.CHINA, "%2d%%", mPercent));
 float percentFloat = mPercent / 100.0f;
 final int ivWidth = mBotIv.getWidth();
 RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) mProgressIv.getLayoutParams();
 int marginEnd = (int) ((1 - percentFloat) * ivWidth);
 lp.width = ivWidth - marginEnd;
 mProgressIv.setLayoutParams(lp);
 mProgressIv.postInvalidate();
 }

显示出dialog并传入进度,就可以看到效果了。

这只是实现效果的一种方法,如果有更多的想法,欢迎和我交流~

相关代码请参阅:

https://github.com/RustFisher/aboutView/blob/master/app/src/main/java/com/rust/aboutview/activity/RoundCornerActivity.java

package com.rust.aboutview.activity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.rust.aboutview.R;
import com.rust.aboutview.widget.RoundCornerProgressDialog;
import com.rustfisher.view.RoundCornerImageView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * 圆角图片示例
 * Created by Rust on 2018/5/23.
 */
public class RoundCornerActivity extends AppCompatActivity implements View.OnClickListener {

 @BindView(R.id.r_iv_1)
 RoundCornerImageView mRIv1;
 @BindView(R.id.r_iv_2)
 RoundCornerImageView mRIv2;
 @BindView(R.id.r_iv_3)
 RoundCornerImageView mRIv3;
 @BindView(R.id.r_iv_4)
 RoundCornerImageView mRIv4;

 private Handler mMainHandler = new Handler(Looper.getMainLooper());
 private RoundCornerProgressDialog mRoundCornerProgressDialog;
 private ProgressThread mProgressThread;

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.act_round_corner);
  initUI();
 }

 private void initUI() {
  ButterKnife.bind(this);
  mRIv1.setRadiusDp(12);
  mRIv2.setRadiusDp(23);
  mRIv3.setRadiusPx(40);
  mRIv4.setRadiusPx(200);
 }

 @OnClick(R.id.pop_dialog_btn)
 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.pop_dialog_btn:
    popRoundProgressDialog();
    break;
  }
 }

 private void popRoundProgressDialog() {
  if (null == mRoundCornerProgressDialog) {
   mRoundCornerProgressDialog = new RoundCornerProgressDialog();
  }
  mRoundCornerProgressDialog.setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTranslucentOrigin);
  mRoundCornerProgressDialog.show(getSupportFragmentManager(), RoundCornerProgressDialog.F_TAG);
  if (null != mProgressThread) {
   mProgressThread.interrupt();
   try {
    mProgressThread.join(400);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   mProgressThread = null;
  }
  mProgressThread = new ProgressThread();
  mProgressThread.start();
 }

 private class ProgressThread extends Thread {

  private int progress = 0;

  @Override
  public void run() {
   super.run();
   while (!isInterrupted()) {
    progress++;
    try {
     Thread.sleep(50);
    } catch (InterruptedException e) {
     e.printStackTrace();
     break;
    }
    if (progress > 100) {
     progress = 0;
    }
    final int p = progress;
    mMainHandler.post(new Runnable() {
     @Override
     public void run() {
      mRoundCornerProgressDialog.updatePercent(p);
     }
    });
   }
  }
 }

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android自定义水平进度条的圆角进度

    平时项目中经常用到自定义进度条样式,我们一般实现的也是下面的第一种,至于第二种的圆角进度,网上介绍的资料也不是很多,这里一起展示一下这两种的实现. 下面开始看代码,先从主界面布局开始看起: <ProgressBar style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="20dp&qu

  • Android 七种进度条的样式

    当一个应用在后台执行时,前台界面就不会有什么信息,这时用户根本不知道程序是否在执行.执行进度如何.应用程序是否遇到错误终止等,这时需要使用进度条来提示用户后台程序执行的进度.Android系统提供了两大类进度条样式,长形进度条(progress-BarStyleHorizontal) 和圆形进度条(progressBarStyleLarge).进度条用处很多,比如,应用程序装载资源和网络连接时,可以提示用户稍等,这一类进度条只是代表应用程序中某一部分的执行情况,而整个应用程序执行情况呢,则可以通

  • Android文件下载进度条的实现代码

    main.xml: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_paren

  • Android带进度的圆形进度条

    我们还是用一个小例子来看看自定义View和自定义属性的使用,带大家来自己定义一个带进度的圆形进度条,我们还是先看一下效果吧 从上面可以看出,我们可以自定义圆环的颜色,圆环进度的颜色,是否显示进度的百分比,进度百分比的颜色,以及进度是实心还是空心等等,这样子是不是很多元化很方便呢?接下来我们就来教大家怎么来定义 1.在values下面新建一个attrs.xml,现在里面定义我们的属性,不同的属性对应不同的format,接下来我贴上我在自定义这个进度条所用到的属性 <?xml version="

  • android自定义进度条渐变色View的实例代码

    最近在公司,项目不是很忙了,偶尔看见一个兄台在CSDN求助,帮忙要一个自定义的渐变色进度条,我当时看了一下进度条,感觉挺漂亮的,就尝试的去自定义view实现了一个,废话不说,先上图吧! 这个自定义的view,完全脱离了android自带的ProgressView,并且没使用一张图片,这样就能更好的降低程序代码上的耦合性! 下面我贴出代码  ,大概讲解一下实现思路吧! 复制代码 代码如下: package com.spring.progressview; import android.conten

  • Android中自定义进度条详解

    Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如: ok,我们开始吧: 一)变换前背景 先来看看progressbar的属性: 复制代码 代码如下: <ProgressBar             android:id="@+id/progressBar"             style="?android:attr/progressBarStyleHor

  • android ListView和ProgressBar(进度条控件)的使用方法

    ListView控件的使用:ListView控件里面装的是一行一行的数据,一行中可能有多列,选中一行,则该行的几列都被选中,同时可以触发一个事件,这种控件在平时还是用得很多的.使用ListView时主要是要设置一个适配器,适配器主要是用来放置一些数据.使用起来稍微有些复杂,这里用的是android自带的SimpleAdapter,形式如下:android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<

  • android自定义进度条渐变圆形

    在安全卫生上,经常看到有圆形的进度条在转动,效果非常好看,于是就尝试去实现一下,具体实现过程不多说了,直接上效果图,先炫耀下. 效果图: 分析:比较常见于扫描结果.进度条等场景 利用canvas.drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)绘制圆弧 Paint的一些属性定义粗细.颜色.样式等 LinearGradient实现颜色的线型渐变 同样的道理,可以画出长条进度

  • Android编程之ProgressBar圆形进度条颜色设置方法

    本文实例讲述了Android ProgressBar圆形进度条颜色设置方法.分享给大家供大家参考,具体如下: 你是不是还在为设置进度条的颜色而烦恼呢--别着急,且看如下如何解决. ProgressBar分圆形进度条和水平进度条 我这里就分享下如何设置圆形进度条的颜色吧,希望对大家会有帮助. 源码如下: 布局文件代码: <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content

  • Android中实现Webview顶部带进度条的方法

    写这篇文章,做份备忘,简单滴展示一个带进度条的Webview示例,进度条位于Webview上面. 示例图如下: 主Activity代码: 复制代码 代码如下: package com.droidyue.demo.webviewprogressbar; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.vi

随机推荐