Commit 3862f044 authored by linfeng's avatar linfeng

自定义进度条

parent 1981765a
package com.rv.component.control; package com.rv.component.control;
public class CircleNumberProgressBar { import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ProgressBar;
/**
* 圆形数字进度条
*/
public class CircleNumberProgressBar extends ProgressBar {
protected Paint mPaint = new Paint();
private int mRadius;
private int mStartAngle;
private int mBarWidth;
private int mReachColor;
private int mUnReachColor;
private int mTextSize;
private int mTextColor;
private int mTextVisibility;
private String mUnit = "";
private int mUnitVisibility;
public static final int VISIBLE = 1;
public static final int INVISIBLE = 0;
private RectF rectF;
private Rect mBound;
public CircleNumberProgressBar(Context context) {
this(context, null);
}
public CircleNumberProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.styleCircleNumberProgressBar);
}
public CircleNumberProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleNumberProgressBar, defStyleAttr, R.style.CircleNumberProgressBar_Style);
mRadius = typedArray.getDimensionPixelSize(R.styleable.CircleNumberProgressBar_cnpb_circle_radius, dp2px(20));
mStartAngle = typedArray.getInteger(R.styleable.CircleNumberProgressBar_cnpb_start_angle, 0);
mBarWidth = typedArray.getDimensionPixelSize(R.styleable.CircleNumberProgressBar_cnpb_bar_width, dp2px(5));
mReachColor = typedArray.getColor(R.styleable.CircleNumberProgressBar_cnpb_reach_color, 0xFFB74B);
mUnReachColor = typedArray.getColor(R.styleable.CircleNumberProgressBar_cnpb_unreach_color, 0xFFD3D6DA);
mTextSize = typedArray.getDimensionPixelSize(R.styleable.CircleNumberProgressBar_cnpb_text_size, sp2px(14));
mTextColor = typedArray.getColor(R.styleable.CircleNumberProgressBar_cnpb_text_color, 0xffffff);
mTextVisibility = typedArray.getInt(R.styleable.CircleNumberProgressBar_cnpb_text_visibility, VISIBLE);
mUnit = typedArray.getString(R.styleable.CircleNumberProgressBar_cnpb_unit);
mUnitVisibility = typedArray.getInt(R.styleable.CircleNumberProgressBar_cnpb_unit_visibility, VISIBLE);
typedArray.recycle();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setStrokeCap(Paint.Cap.ROUND);
rectF = new RectF(0, 0, mRadius * 2, mRadius * 2); //绘制圆弧时用于规定圆弧边界
mBound = new Rect(); //用于获取字体边界
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
int width = 0;
int height = 0;
switch (widthSpecMode) {
case MeasureSpec.AT_MOST:
width = Math.min(mRadius * 2 + getPaddingLeft() + getPaddingRight() + mBarWidth, widthSpecSize);
break;
case MeasureSpec.EXACTLY:
width = widthSpecSize;
break;
case MeasureSpec.UNSPECIFIED:
width = mRadius * 2 + getPaddingRight() + getPaddingLeft() + mBarWidth;
break;
}
switch (heightSpecMode) {
case MeasureSpec.AT_MOST:
height = Math.min(mRadius * 2 + getPaddingTop() + getPaddingBottom() + mBarWidth, heightSpecSize);
break;
case MeasureSpec.EXACTLY:
height = heightSpecSize;
break;
case MeasureSpec.UNSPECIFIED:
height = mRadius * 2 + getPaddingTop() + getPaddingBottom() + mBarWidth;
break;
}
int result = Math.min(width, height);
setMeasuredDimension(result, result);
}
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
String text = mUnitVisibility == VISIBLE ? getProgress() + mUnit : getProgress() + "";
float baseline = getMeasuredHeight() / 2 + mPaint.getTextSize() / 2 - mPaint.getFontMetrics().descent - getPaddingTop();
canvas.save();
canvas.translate(getPaddingLeft() + mBarWidth / 2, getPaddingTop() + mBarWidth / 2);
mPaint.setStyle(Paint.Style.STROKE);
//先绘制未达到的进度条
mPaint.setColor(mUnReachColor);
mPaint.setStrokeWidth(mBarWidth);
canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
//再绘制已经达到的进度条
mPaint.setColor(mReachColor);
mPaint.setStrokeWidth(mBarWidth);
float angle = getProgress() * 1.0f / getMax() * 360;
canvas.drawArc(rectF, mStartAngle, angle, false, mPaint);
//绘制文字
if (mTextVisibility == VISIBLE) {
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mTextColor);
mPaint.setTextSize(mTextSize);
mPaint.getTextBounds(text, 0, text.length(), mBound);
canvas.drawText(text, mRadius - mBound.width() / 2, baseline, mPaint);
}
canvas.restore();
}
/**
* 设置圆的半径
*
* @param radius 半径值(dp为单位)
*/
public void setRadius(int radius) {
mRadius = dp2px(radius);
}
/**
* 设置进度条的宽度
*
* @param width
*/
public void setBarWidth(int width) {
mBarWidth = width;
}
/**
* 设置达到进度的颜色
*
* @param color 颜色值
*/
public void setReachColor(int color) {
mReachColor = color;
}
/**
* 设置文字颜色值
*
* @param color 颜色值
*/
public void setTextColor(int color) {
mTextColor = color;
}
/**
* 设置文字大小
*
* @param size
*/
public void setTextSize(int size) {
mTextSize = size;
}
/**
* 设置文字是否显示
*
* @param visibility
*/
public void setTextVisibility(int visibility) {
mTextVisibility = visibility;
}
/**
* 设置单位
*
* @param unit
*/
public void setUnit(String unit) {
if (unit == null) {
mUnit = "";
} else {
mUnit = unit;
}
}
/**
* 设置单位是否显示
*
* @param visibility
*/
public void setUnitVisibility(int visibility) {
mUnitVisibility = visibility;
}
/**
* 将dp值转换为px值
*
* @param dp 需要转换的dp值
* @return px值
*/
protected int dp2px(float dp) {
// return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
return (int) (getResources().getDisplayMetrics().density * dp + 0.5f);
}
/**
* 将sp值转换为px值
*
* @param sp 需要转换的sp值
* @return px值
*/
protected int sp2px(float sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
}
} }
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="styleCircleNumberProgressBar" format="reference" />
<declare-styleable name="CircleNumberProgressBar">
<!-- 圆的半径 -->
<attr name="cnpb_circle_radius" format="dimension"/>
<!-- 开始角度,0 ~ 360 -->
<attr name="cnpb_start_angle" format="integer" />
<!-- 进度条的宽度 -->
<attr name="cnpb_bar_width" format="dimension" />
<!-- 达到的进度颜色 -->
<attr name="cnpb_reach_color" format="color" />
<!-- 未达到的进度颜色 -->
<attr name="cnpb_unreach_color" format="color" />
<!-- 文字大小 -->
<attr name="cnpb_text_size" format="dimension" />
<!-- 文字颜色 -->
<attr name="cnpb_text_color" format="color" />
<!-- 文字是否显示 -->
<attr name="cnpb_text_visibility" format="enum">
<enum name="invisible" value="0"/>
<enum name="visible" value="1"/>
</attr>
<!-- 单位 -->
<attr name="cnpb_unit" format="string"/>
<!-- 单位是否显示 -->
<attr name="cnpb_unit_visibility" format="enum">
<enum name="invisible" value="0"/>
<enum name="visible" value="1"/>
</attr>
</declare-styleable>
<style name="CircleNumberProgressBar">
</style>
<style name="CircleNumberProgressBar.Style">
<item name="cnpb_circle_radius">50dp</item>
<item name="cnpb_start_angle">0</item>
<item name="cnpb_bar_width">3dp</item>
<item name="cnpb_reach_color">#FFB74B</item>
<item name="cnpb_unreach_color">#FFD3D6DA</item>
<item name="cnpb_text_size">10sp</item>
<item name="cnpb_text_color">#ffffff</item>
<item name="cnpb_text_visibility">visible</item>
<item name="cnpb_unit">%</item>
<item name="cnpb_unit_visibility">visible</item>
</style>
</resources>
\ No newline at end of file
...@@ -10,13 +10,14 @@ import android.widget.TextView; ...@@ -10,13 +10,14 @@ import android.widget.TextView;
import com.ruiwenliu.wrapper.dialog.BaseDialog; import com.ruiwenliu.wrapper.dialog.BaseDialog;
import com.ruiwenliu.wrapper.util.ViewHolder; import com.ruiwenliu.wrapper.util.ViewHolder;
import com.rv.component.control.CircleNumberProgressBar;
/** /**
* 温馨提示 * 温馨提示
*/ */
public class DownloadLoadingDialog extends BaseDialog { public class DownloadLoadingDialog extends BaseDialog {
TextView tv; TextView tv;
ProgressBar pb; CircleNumberProgressBar pb;
public DownloadLoadingDialog(@NonNull Context context) { public DownloadLoadingDialog(@NonNull Context context) {
super(context); super(context);
...@@ -27,7 +28,7 @@ public class DownloadLoadingDialog extends BaseDialog { ...@@ -27,7 +28,7 @@ public class DownloadLoadingDialog extends BaseDialog {
public void helper(ViewHolder helper) { public void helper(ViewHolder helper) {
super.helper(helper); super.helper(helper);
tv = (TextView) helper.getView(R.id.rv_hint); tv = (TextView) helper.getView(R.id.rv_hint);
pb = (ProgressBar) helper.getView(R.id.pb_load); pb = (CircleNumberProgressBar) helper.getView(R.id.pb_load);
} }
@Override @Override
...@@ -37,9 +38,8 @@ public class DownloadLoadingDialog extends BaseDialog { ...@@ -37,9 +38,8 @@ public class DownloadLoadingDialog extends BaseDialog {
public void setContent(int percentage) { public void setContent(int percentage) {
if (tv != null) { if (tv != null) {
tv.setText("下载中..." + percentage + "%"); pb.setProgress(percentage);
if (percentage == 100) {
if (percentage ==100){
pb.setVisibility(View.GONE); pb.setVisibility(View.GONE);
tv.setText("已保存到相册,快去分享吧!"); tv.setText("已保存到相册,快去分享吧!");
} }
......
...@@ -9,12 +9,13 @@ import android.widget.ProgressBar; ...@@ -9,12 +9,13 @@ import android.widget.ProgressBar;
import com.ruiwenliu.wrapper.dialog.BaseDialog; import com.ruiwenliu.wrapper.dialog.BaseDialog;
import com.ruiwenliu.wrapper.util.ViewHolder; import com.ruiwenliu.wrapper.util.ViewHolder;
import com.rv.component.control.CircleNumberProgressBar;
/** /**
* 温馨提示 * 温馨提示
*/ */
public class ProgressBarDialog extends BaseDialog { public class ProgressBarDialog extends BaseDialog {
ProgressBar progressBar; CircleNumberProgressBar progressBar;
public ProgressBarDialog(@NonNull Context context) { public ProgressBarDialog(@NonNull Context context) {
super(context); super(context);
...@@ -24,7 +25,7 @@ public class ProgressBarDialog extends BaseDialog { ...@@ -24,7 +25,7 @@ public class ProgressBarDialog extends BaseDialog {
@Override @Override
public void helper(ViewHolder helper) { public void helper(ViewHolder helper) {
super.helper(helper); super.helper(helper);
progressBar = (ProgressBar) helper.getView(R.id.pb_show); progressBar = (CircleNumberProgressBar) helper.getView(R.id.cnpb_progress_first);
} }
@Override @Override
......
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/size_60" android:layout_height="@dimen/size_50"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:gravity="center" android:gravity="center"
...@@ -8,21 +9,19 @@ ...@@ -8,21 +9,19 @@
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/size_60" android:layout_height="@dimen/size_50"
android:background="@color/colorMain" android:background="@drawable/shape_rv_bg_black_circle"
android:gravity="center" android:gravity="center"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingLeft="@dimen/size_15" android:paddingLeft="@dimen/size_20"
android:paddingRight="@dimen/size_15"> android:paddingRight="@dimen/size_20">
<ProgressBar <com.rv.component.control.CircleNumberProgressBar
android:id="@+id/pb_load" android:id="@+id/pb_load"
android:layout_width="40dp" android:layout_width="wrap_content"
android:layout_height="40dp" android:layout_height="wrap_content"
android:layout_centerInParent="true" app:cnpb_circle_radius="@dimen/size_15" />
android:layout_gravity="center"
android:indeterminate="true"
android:indeterminateDrawable="@drawable/bg_progressbar_loading" />
<!--</RelativeLayout>--> <!--</RelativeLayout>-->
<TextView <TextView
...@@ -33,6 +32,6 @@ ...@@ -33,6 +32,6 @@
android:layout_marginLeft="@dimen/size_10" android:layout_marginLeft="@dimen/size_10"
android:text="下载中..." android:text="下载中..."
android:textColor="@color/colorWrite" android:textColor="@color/colorWrite"
android:textSize="@dimen/text_14" /> android:textSize="@dimen/text_12" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="@dimen/size_50"
android:gravity="center"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="@dimen/size_50"
android:layout_marginLeft="@dimen/size_40" android:background="@drawable/shape_rv_bg_black_circle"
android:layout_marginRight="@dimen/size_40" android:gravity="center"
android:background="@color/colorWrite" android:orientation="horizontal"
android:orientation="vertical"> android:paddingLeft="@dimen/size_20"
android:paddingRight="@dimen/size_20">
<ProgressBar <com.rv.component.control.CircleNumberProgressBar
android:id="@+id/pb_show" android:id="@+id/cnpb_progress_first"
style="?android:attr/progressBarStyleHorizontal" android:layout_width="wrap_content"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="@dimen/size_20" app:cnpb_circle_radius="@dimen/size_15" />
android:layout_gravity="center"
android:max="100" <TextView
android:progressDrawable="@drawable/progressbar_bg" android:layout_width="wrap_content"
/> android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_10"
android:text="发布中..."
android:textColor="@color/colorWrite"
android:textSize="@dimen/text_12" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="8dp" />
<solid android:color="@color/gray_90000000" />
</shape>
\ No newline at end of file
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
<color name="gray_50ffffff">#50ffffff</color> <color name="gray_50ffffff">#50ffffff</color>
<color name="gray_707070">#707070</color> <color name="gray_707070">#707070</color>
<color name="gray_50000000">#50000000</color> <color name="gray_50000000">#50000000</color>
<color name="gray_90000000">#90000000</color>
<color name="gray_EEEEEE">#EEEEEE</color> <color name="gray_EEEEEE">#EEEEEE</color>
<color name="gray_ba242525">#ba242525</color> <color name="gray_ba242525">#ba242525</color>
<color name="gray_F64747">#F64747</color> <color name="gray_F64747">#F64747</color>
......
...@@ -26,6 +26,7 @@ import com.ruiwenliu.wrapper.util.ViewHolder; ...@@ -26,6 +26,7 @@ import com.ruiwenliu.wrapper.util.ViewHolder;
import com.ruiwenliu.wrapper.util.permission.RxPermission; import com.ruiwenliu.wrapper.util.permission.RxPermission;
import com.ruiwenliu.wrapper.weight.horizontal.GallerySnapHelper; import com.ruiwenliu.wrapper.weight.horizontal.GallerySnapHelper;
import com.ruiwenliu.wrapper.weight.horizontal.SpaceItemDecoration; import com.ruiwenliu.wrapper.weight.horizontal.SpaceItemDecoration;
import com.rv.component.dialog.ProgressBarDialog;
import com.rv.component.utils.DisplayUtil; import com.rv.component.utils.DisplayUtil;
import com.xxfc.discovery.adapter.DiscoveryMenuAdapter; import com.xxfc.discovery.adapter.DiscoveryMenuAdapter;
import com.xxfc.discovery.event.PostPatEvent; import com.xxfc.discovery.event.PostPatEvent;
...@@ -257,9 +258,7 @@ public class DiscoveryFragment extends BaseFragment<DiscoveryPresenter> { ...@@ -257,9 +258,7 @@ public class DiscoveryFragment extends BaseFragment<DiscoveryPresenter> {
dismiss(); dismiss();
} else if (id == R.id.tv_short_video) { } else if (id == R.id.tv_short_video) {
// verifyAudioPermissions(_mActivity);
processPicker(); processPicker();
dismiss(); dismiss();
} else if (id == R.id.tv_ask_questions) { } else if (id == R.id.tv_ask_questions) {
//去提问 //去提问
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment