This commit is contained in:
lixiaopeng
2020-12-23 16:53:14 +08:00
parent 4b6031b52e
commit 70260b1b87
4 changed files with 153 additions and 142 deletions

View File

@@ -192,7 +192,7 @@ public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener<M
}
} else {
mCurrentUuid = mCloudRoadData.getUuid();
if (isVrMode) { //TODO 是否需要延迟
if (isVrMode) { // 是否需要延迟
Log.d(TAG, "-------------4------------");
addVrCameraMarker(mCloudRoadData);
isVrModeMarker = true;

View File

@@ -1,165 +1,174 @@
package com.mogo.module.media.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;
import com.mogo.module.media.R;
/**
* 环形进度条
*/
public class PercentageRingView extends View {
private Paint mCirclePaint;
private Paint mTextPaint;
private Paint mArcPaint;
private int mCircleX;
private int mCircleY;
private float mCurrentAngle;
private RectF mArcRectF;
private float mStartSweepValue;
private float mTargetPercent;
private float mCurrentPercent;
private int mRadius;
private int mCircleBackground;
private int mRingColor;
private int mTextSize;
private int mTextColor;
private Paint pathPaint;
private Paint fillArcPaint;
// 设置光源的方向
private float[] direction = new float[]{1, 1, 1};
/**
* 透明
*/
public static final int TRANSPARENT = 0x00000000;
/**
* 红色
*/
public static final int RED = 0xffff0000;
// 设置环境光亮度
private float light = 0.4f;
//渐变数组
private int[] arcColors = new int[]{RED, TRANSPARENT};
// 选择要应用的反射等级
private float specular = 6;
private EmbossMaskFilter emboss;
private RectF oval;
private BlurMaskFilter mBlur;
// view重绘的标记
private boolean reset = false;
// 向 mask应用一定级别的模糊
private float blur = 3.5f;
private int arcradus = 30;
//初始化进度
private int progress = 0;
//设置进度最大值
private int max = 100;
public PercentageRingView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public PercentageRingView(Context context, AttributeSet attrs) {
super(context, attrs);
//自定义属性 values/attr
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PercentageRing);
//中间圆的背景颜色 默认为浅紫色
mCircleBackground = typedArray.getColor(R.styleable.PercentageRing_circleBackground, 0xffafb4db);
//外圆环的颜色 默认为深紫色
mRingColor = typedArray.getColor(R.styleable.PercentageRing_ringColor, 0xff6950a1);
//中间圆的半径 默认为60
mRadius = typedArray.getInt(R.styleable.PercentageRing_radius, 60);
//字体颜色 默认为白色
mTextColor = typedArray.getColor(R.styleable.PercentageRing_textColor, 0xffffffff);
//最后一定要调用这个 释放掉TypedArray
typedArray.recycle();
//初始化数据
init(context);
initPaint();
oval = new RectF();
emboss = new EmbossMaskFilter(direction, light, specular, blur);
mBlur = new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL);
}
public PercentageRingView(Context context) {
super(context);
init(context);
//初始化画笔操作
private void initPaint() {
//初始化画笔操作
pathPaint = new Paint();
// 设置是否抗锯齿
pathPaint.setAntiAlias(true);
// 帮助消除锯齿
pathPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
// 设置中空的样式
pathPaint.setStyle(Paint.Style.STROKE);
pathPaint.setDither(true);
pathPaint.setStrokeJoin(Paint.Join.ROUND);
fillArcPaint = new Paint();
// 设置是否抗锯齿
fillArcPaint.setAntiAlias(true);
// 帮助消除锯齿
fillArcPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
// 设置中空的样式
fillArcPaint.setStyle(Paint.Style.STROKE);
fillArcPaint.setDither(true);
fillArcPaint.setStrokeJoin(Paint.Join.ROUND);
}
private void init(Context context) {
//圆环开始角度 -90° 正北方向
mStartSweepValue = -90;
//当前角度
mCurrentAngle = 0;
//当前百分比
mCurrentPercent = 0;
//设置中心园的画笔
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(mCircleBackground);
mCirclePaint.setStyle(Paint.Style.FILL);
//设置文字的画笔
mTextPaint = new Paint();
mTextPaint.setColor(mTextColor);
mTextPaint.setAntiAlias(true);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setStrokeWidth((float) (0.025 * mRadius));
mTextPaint.setTextSize(mRadius / 2);
mTextPaint.setTextAlign(Align.CENTER);
//设置外圆环的画笔
mArcPaint = new Paint();
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(mRingColor);
mArcPaint.setStyle(Paint.Style.STROKE);
// mArcPaint.setStrokeWidth((float) (0.075 * mRadius));
mArcPaint.setStrokeWidth((float) (0.17 * mRadius));
//获得文字的字号 因为要设置文字在圆的中心位置
mTextSize = (int) mTextPaint.getTextSize();
}
//主要是测量wrap_content时候的宽和高因为宽高一样只需要测量一次宽即可高等于宽
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measure(widthMeasureSpec), measure(widthMeasureSpec));
//设置圆心坐标
mCircleX = getMeasuredWidth() / 2;
mCircleY = getMeasuredHeight() / 2;
//如果半径大于圆心横坐标,需要手动缩小半径的值,否则就画到外面去了
if (mRadius > mCircleX) {
//设置半径大小为圆心横坐标到原点的距离
mRadius = mCircleX;
mRadius = (int) (mCircleX - 0.075 * mRadius);
//因为半径改变了,所以要重新设置一下字体宽度
mTextPaint.setStrokeWidth((float) (0.025 * mRadius));
//重新设置字号
mTextPaint.setTextSize(mRadius / 2);
//重新设置外圆环宽度
// mArcPaint.setStrokeWidth((float) (0.075 * mRadius));
mArcPaint.setStrokeWidth((float) (0.17 * mRadius));
//重新获得字号大小
mTextSize = (int) mTextPaint.getTextSize();
}
//画中心园的外接矩形,用来画圆环用
mArcRectF = new RectF(mCircleX - mRadius, mCircleY - mRadius, mCircleX + mRadius, mCircleY + mRadius);
}
//当wrap_content的时候view的大小根据半径大小改变但最大不会超过屏幕
private int measure(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = (int) (1.075 * mRadius * 2);
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}
//开始画中间圆、文字和外圆环
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画中间圆
canvas.drawCircle(mCircleX, mCircleY, mRadius, mCirclePaint);
//画圆环
canvas.drawArc(mArcRectF, mStartSweepValue, mCurrentAngle, false, mArcPaint);
//画文字
canvas.drawText(String.valueOf(mCurrentPercent) + "%", mCircleX, mCircleY + mTextSize / 4, mTextPaint);
//判断当前百分比是否小于设置目标的百分比
if (mCurrentPercent < mTargetPercent) {
//当前百分比+1
mCurrentPercent += 1;
//当前角度+360
mCurrentAngle += 3.6;
//每10ms重画一次
postInvalidateDelayed(10);
if (reset) {
canvas.drawColor(Color.TRANSPARENT);
reset = false;
}
drawcircle(canvas);
}
//设置目标的百分比
public void setTargetPercent(int percent) {
this.mTargetPercent = percent;
private void drawcircle(Canvas canvas) {
int height = getMeasuredWidth();
int width = getMeasuredWidth();
//半径 = 宽/2-圆环的宽度
int radius = width / 2 - arcradus;
int cx = width / 2;
int cy = height / 2;
pathPaint.setColor(Color.BLUE);
//绘制大圆
canvas.drawCircle(width / 2, height / 2, radius + arcradus
/ 2 + 0.5f, pathPaint);
//绘制小圆
canvas.drawCircle(width / 2, height / 2, radius - arcradus
/ 2 - 0.5f, pathPaint);
// 环形颜色填充
SweepGradient sweepGradient =
new SweepGradient(width / 2, height / 2, arcColors, null);
fillArcPaint.setShader(sweepGradient);
// 设置画笔为白色
// 模糊效果
fillArcPaint.setMaskFilter(mBlur);
// 设置线的类型,边是圆的
fillArcPaint.setStrokeCap(Paint.Cap.ROUND);
//设置圆弧的宽度
fillArcPaint.setStrokeWidth(arcradus + 1);
// 确定圆弧的绘制位置,也就是里面圆弧坐标和外面圆弧坐标
oval.set(width / 2 - radius, height / 2 - radius, width
/ 2 + radius, height / 2 + radius);
// 画圆弧第二个参数为起始角度第三个为跨的角度第四个为true的时候是实心false的时候为空心
canvas.drawArc(oval,
0,
((float) progress / max) * 360,
false,
fillArcPaint);
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
this.invalidate();
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public int[] getArcColors() {
return arcColors;
}
public void setArcColors(int[] arcColors) {
this.arcColors = arcColors;
// this.invalidate();
}
/**
* 描述:重置进度
*
* @throws
*/
public void reset() {
reset = true;
this.progress = 0;
this.invalidate();
}
}

View File

@@ -1,6 +1,7 @@
package com.mogo.module.media.window;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -68,6 +69,7 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
private ICallProviderResponse mCallProviderResponse;
private CircleNumberProgress mPercentageRingView;
// private PercentageRingView mPercentageRingView;
private ImageView mPauseImage;
private AnimCircleImageView mAnimCircleImageView;
@@ -149,6 +151,15 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
mAnimCircleImageView = mWindowView.findViewById(R.id.window_circle_img_new);
mPauseImage = mWindowView.findViewById(R.id.window_play_pause_new);
// int[] arcColors = new int[]{
// Color.parseColor("#1Affffff"),
// Color.parseColor("#80ffffff"),
// Color.parseColor("#BFffffff"),
// Color.parseColor("#ffffff")
// };
//
// mPercentageRingView.setArcColors(arcColors);
if (mPauseImage != null) {
mPauseImage.setImageResource(R.drawable.module_media_window_pop_pause_new);
}
@@ -366,7 +377,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
@Override
public void onMusicPlaying() {
Logger.d(TAG, "onMusicPlaying===" + mMediaInfoData);
Log.d(TAG, "onMusicPlaying===" + mMediaInfoData);
isFirstPlay = false;
updateWindowUI(false);
if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
@@ -393,7 +403,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
@Override
public void onMusicPause() {
Logger.d(TAG, "onMusicPause: ===" + mMediaInfoData);
Log.d(TAG, "onMusicPause: ===" + mMediaInfoData);
if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
if (mPauseImage != null) {
mPauseImage.setImageResource(R.drawable.module_media_window_pop_pause_new);
@@ -418,7 +427,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
@Override
public void onMusicStopped() {
Logger.d(TAG, "onMusicStopped===" + mMediaInfoData);
Log.d(TAG, "onMusicStopped===" + mMediaInfoData);
if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
if (mPauseImage != null) {
mPauseImage.setImageResource(R.drawable.module_media_window_pop_pause_new);
@@ -443,7 +451,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
@Override
public void onMediaInfoChanged(MediaInfoData mediaInfoData) {
Logger.d(TAG, "onMediaInfoChanged: " + mediaInfoData);
Log.d(TAG, "onMediaInfoChanged:" + mediaInfoData);
mMediaInfoData = mediaInfoData;
addWindowView();
updateWindowUI();
@@ -458,7 +465,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
(int) ((current * 1.0f * 100) / (total * 1.0f));
if (mPercentageRingView != null) {
mPercentageRingView.setVisibility(View.VISIBLE);
Log.d(TAG, "progress vr = " + progress);
mPercentageRingView.setProgress(progress);
}
} catch (Exception e) {
@@ -477,7 +483,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
int progress =
(int) ((current * 1.0f * 100) / (total * 1.0f));
if (mWindowProgress != null) {
// Log.d(TAG, "progress = " + progress);
mWindowProgress.setProgress(progress);
}
} catch (Exception e) {

View File

@@ -23,10 +23,7 @@
<!-- app:layout_constraintTop_toTopOf="parent"-->
<!-- app:layout_constraintRight_toRightOf="parent"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- app:circleBackground="@color/modules_media_music_bg_color"-->
<!-- app:radius="100"-->
<!-- app:ringColor="@color/modules_media_music_circle_color" />-->
<!-- android:layout_height="match_parent" />-->
<com.mogo.module.media.widget.AnimCircleImageView
android:id="@+id/window_circle_img_new"