package com.mylhyl.circledialog.view;
|
|
import android.content.Context;
|
import android.content.res.ColorStateList;
|
import android.os.Build;
|
import android.os.Handler;
|
import android.os.Message;
|
import android.text.TextUtils;
|
import android.view.Gravity;
|
import android.widget.LinearLayout;
|
import android.widget.ProgressBar;
|
import android.widget.TextView;
|
|
import com.mylhyl.circledialog.internal.BackgroundHelper;
|
import com.mylhyl.circledialog.internal.CircleParams;
|
import com.mylhyl.circledialog.internal.Controller;
|
import com.mylhyl.circledialog.params.DialogParams;
|
import com.mylhyl.circledialog.params.ProgressParams;
|
import com.mylhyl.circledialog.res.values.CircleDimen;
|
import com.mylhyl.circledialog.view.listener.OnCreateProgressListener;
|
|
import java.lang.reflect.Field;
|
import java.lang.reflect.Modifier;
|
|
/**
|
* Created by hupei on 2017/3/31.
|
*/
|
|
final class BodyProgressView extends LinearLayout {
|
private DialogParams mDialogParams;
|
private ProgressParams mProgressParams;
|
private OnCreateProgressListener mOnCreateProgressListener;
|
private ProgressBar mProgressBar;
|
private TextView mTextView;
|
private Handler mViewUpdateHandler;
|
|
public BodyProgressView(Context context, CircleParams circleParams) {
|
super(context);
|
init(circleParams);
|
}
|
|
/**
|
* 循环向上转型,获取对象的DeclaredField.
|
*/
|
protected static Field getDeclaredField(final Object object, final String fieldName) {
|
return getDeclaredField(object.getClass(), fieldName);
|
}
|
|
/**
|
* 强制转换fileld可访问.
|
*/
|
protected static void makeAccessible(Field field) {
|
if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
|
field.setAccessible(true);
|
}
|
}
|
|
/**
|
* 循环向上转型,获取类的DeclaredField.
|
*/
|
@SuppressWarnings("unchecked")
|
protected static Field getDeclaredField(final Class clazz, final String fieldName) {
|
for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {
|
try {
|
return superClass.getDeclaredField(fieldName);
|
} catch (NoSuchFieldException e) {
|
e.printStackTrace();// Field不在当前类定义,继续向上转型
|
}
|
}
|
return null;
|
}
|
|
/**
|
* 直接设置对象属性值,无视private/protected修饰符,不经过setter函数.
|
*/
|
private static void setFieldValue(final Object object, final String fieldName, final Object value) {
|
Field field = getDeclaredField(object, fieldName);
|
if (field == null)
|
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");
|
makeAccessible(field);
|
try {
|
field.set(object, value);
|
} catch (IllegalAccessException e) {
|
e.printStackTrace();
|
}
|
}
|
|
public synchronized void refreshProgress() {
|
mProgressBar.setMax(mProgressParams.max);
|
mProgressBar.setProgress(mProgressParams.progress);
|
mProgressBar.setSecondaryProgress(mProgressParams.progress + 10);
|
onProgressChanged();
|
}
|
|
private void init(CircleParams circleParams) {
|
this.mDialogParams = circleParams.dialogParams;
|
this.mProgressParams = circleParams.progressParams;
|
this.mOnCreateProgressListener = circleParams.circleListeners.createProgressListener;
|
|
setOrientation(LinearLayout.VERTICAL);
|
|
//如果没有背景色,则使用默认色
|
int backgroundColor = mProgressParams.backgroundColor != 0 ?
|
mProgressParams.backgroundColor : mDialogParams.backgroundColor;
|
BackgroundHelper.handleBodyBackground(this, backgroundColor, circleParams);
|
|
createProgressBar();
|
createText();
|
|
if (mOnCreateProgressListener != null) {
|
mOnCreateProgressListener.onCreateProgressView(mProgressBar, mTextView);
|
}
|
}
|
|
private void createText() {
|
//构建文本
|
mTextView = new TextView(getContext());
|
if (mDialogParams.typeface != null) {
|
mTextView.setTypeface(mDialogParams.typeface);
|
}
|
mTextView.setGravity(Gravity.CENTER);
|
mTextView.setTextSize(mProgressParams.textSize);
|
mTextView.setTextColor(mProgressParams.textColor);
|
mTextView.setTypeface(mTextView.getTypeface(), mProgressParams.styleText);
|
int[] padding = mProgressParams.padding;
|
if (padding != null) {
|
mTextView.setPadding(Controller.dp2px(getContext(), padding[0]),
|
Controller.dp2px(getContext(), padding[1]),
|
Controller.dp2px(getContext(), padding[2]),
|
Controller.dp2px(getContext(), padding[3]));
|
}
|
addView(mTextView);
|
|
if (!TextUtils.isEmpty(mProgressParams.text)) {
|
mTextView.setText(mProgressParams.text);
|
}
|
mViewUpdateHandler = new Handler() {
|
@Override
|
public void handleMessage(Message msg) {
|
super.handleMessage(msg);
|
if (mProgressParams.style == ProgressParams.STYLE_HORIZONTAL) {
|
int progress = mProgressBar.getProgress();
|
int max = mProgressBar.getMax();
|
int percent = (int) (((float) progress / (float) max) * 100);
|
String args = percent + "%";
|
if (mProgressParams.text.contains("%s"))
|
mTextView.setText(String.format(mProgressParams.text, args));
|
else mTextView.setText(mProgressParams.text + args);
|
} else {
|
mTextView.setText(mProgressParams.text);
|
}
|
}
|
};
|
|
|
mTextView.setText(mProgressParams.text);
|
}
|
|
private void createProgressBar() {
|
//自定义样式
|
int progressDrawableId = mProgressParams.progressDrawableId;
|
//水平样式
|
if (mProgressParams.style == ProgressParams.STYLE_HORIZONTAL) {
|
if (progressDrawableId != 0) {
|
mProgressBar = new ProgressBar(getContext());
|
setFieldValue(mProgressBar, "mOnlyIndeterminate", new Boolean(false));
|
mProgressBar.setIndeterminate(false);
|
if (Controller.SDK_LOLLIPOP)
|
mProgressBar.setProgressDrawableTiled(getContext().getDrawable(progressDrawableId));
|
else
|
mProgressBar.setProgressDrawable(getContext().getResources().getDrawable(progressDrawableId));
|
} else {
|
mProgressBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyleHorizontal);
|
}
|
mProgressParams.progressHeight = CircleDimen.PROGRESS_HEIGHT_HORIZONTAL;
|
}
|
//旋转样式
|
else {
|
if (progressDrawableId != 0) {
|
mProgressBar = new ProgressBar(getContext());
|
if (Controller.SDK_LOLLIPOP)
|
mProgressBar.setIndeterminateDrawableTiled(getContext().getDrawable(progressDrawableId));
|
else
|
mProgressBar.setIndeterminateDrawable(getContext().getResources().getDrawable(progressDrawableId));
|
} else {
|
mProgressBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyle);
|
// 旋转颜色
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (mProgressParams.indeterminateColor != 0) {
|
ColorStateList colorStateList = ColorStateList.valueOf(mProgressParams.indeterminateColor);
|
mProgressBar.setIndeterminateTintList(colorStateList);
|
}
|
}
|
}
|
mProgressParams.progressHeight = CircleDimen.PROGRESS_HEIGHT_SPINNER;
|
}
|
|
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, Controller.dp2px(getContext(),
|
mProgressParams.progressHeight));
|
int[] margins = mProgressParams.margins;
|
if (margins != null) {
|
layoutParams.setMargins(Controller.dp2px(getContext(), margins[0]),
|
Controller.dp2px(getContext(), margins[1]),
|
Controller.dp2px(getContext(), margins[2]),
|
Controller.dp2px(getContext(), margins[3]));
|
}
|
addView(mProgressBar, layoutParams);
|
}
|
|
private void onProgressChanged() {
|
if (mViewUpdateHandler != null && !mViewUpdateHandler.hasMessages(0))
|
mViewUpdateHandler.sendEmptyMessage(0);
|
}
|
}
|