相关代码请参阅: github.com/RustFisher/…java
美工同窗指定了一个进度条样式android
这斑斓的进度条,若是要本身画实在是劳民伤财。因而请美工切了一张素材(样例)。git
若是用shape或者.9图片不太好处理这个条纹。转变思路,放置2张图片。一张做为背景(底,bottom),一张做为进度条图片(cover)。 进度改变时,改变上面图片的宽度。github
这就要求上面的图片是圆角的。自定义ImageView,调用canvas.clipPath
来切割画布。canvas
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()
方法。app
回到咱们要的进度条。布局文件中放置好层叠的图片。ide
<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并传入进度,就能够看到效果了。post
这只是实现效果的一种方法,若是有更多的想法,欢迎和我交流~this