//package com.hdl.widget; // //import android.annotation.SuppressLint; //import android.content.Context; //import android.content.res.TypedArray; //import android.graphics.Bitmap; //import android.graphics.BitmapFactory; //import android.graphics.Canvas; //import android.graphics.Color; //import android.graphics.Matrix; //import android.graphics.Paint; //import android.graphics.Path; //import android.graphics.PorterDuff; //import android.graphics.PorterDuffXfermode; //import android.graphics.RectF; //import android.os.Bundle; //import android.os.Parcelable; //import android.util.AttributeSet; //import android.util.TypedValue; //import android.view.MotionEvent; //import android.view.View; // //import com.hdl.widgetxm.R; // //import static android.view.MotionEvent.ACTION_CANCEL; //import static android.view.MotionEvent.ACTION_DOWN; //import static android.view.MotionEvent.ACTION_MOVE; //import static android.view.MotionEvent.ACTION_UP; // ////import com.hdl.arcseekbar.R; ////import com.hdl.widget.Utils.HDLUtils; // ///** // * Created by JLChen on 2019/11/4 // */ //public class HDLCurtainSeekBar extends View { // // private static final int DEFAULT_WAVE_BORDER_COLOR = 0xFFCBCEE5; // private static final int DEFAULT_WAVE_COLOR = 0xFFCBCEE5; // private static final int DEFAULT_WAVE_BACKGROUND = 0xFFE5E5ED; // // private static final int DEFAULT_EDGE_LENGTH = 200; // 默认宽高 //// private Paint mBorderPaint;//进度框画笔 // private Paint circlePaint;//进度框画笔 // private Paint curtainPaint;//绘制波浪画笔 // private Path curtainPath;//绘制波浪Path // private Paint mTextPaint; //进度文字显示内容 // private Bitmap bitmap;//缓存bitmap // private Canvas bitmapCanvas; // // private float curtainWidth;//波浪宽度 // private float curtainHeight;//波浪高度 // private float defaultSize;//自定义View默认的宽高 // private float mPercent;//进度条占比 // private int mProgress;//可以更新的进度条数值 // // private int curtainColor;//波浪颜色 // private int bgColor;//背景进度颜色 // // private int mPadding = 10; // // private Boolean isClickable = true; // private float mSeekBarWidth; // private float mSeekBarHeight; // // private float mcurtainViewWidth;//重新测量后View实际的宽 // private float mcurtainViewHeight;//重新测量后View实际的高 // // private int mMaxValue; // 最大数值 // private int mMinValue; // 最小数值 // private float mCenterX; // 圆弧 SeekBar 中心点 X // private float mCenterY; // 圆弧 SeekBar 中心点 Y // private String mProgressBarUnitSring; //进度单位符号 // private static final String DEFAULT_ARC_PROGRESS_BAR_UNIT_STRING = "%"; // 默认显示单位 // private float mCurtainLeftAndTop,mCurtainRight,mCurtainBottom; // // private Boolean isProgressTextShow = true; // // private int mCornerRadius; //圆角半径大小 // private float nowY; // private float buttonWidth = 10; // // private int topCompensatePadding = 5; //顶部图片补偿值 // private Bitmap bgBitmapCurtain,bgBitmapButton; // // // public HDLCurtainSeekBar(Context context) { // this(context, null); // } // // public HDLCurtainSeekBar(Context context, AttributeSet attrs) { // this(context, attrs, 0); // } // // public HDLCurtainSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { // super(context, attrs, defStyleAttr); // setSaveEnabled(true); // setLayerType(LAYER_TYPE_SOFTWARE, null); // initAttrs(context, attrs); // initData(); // initPaint(); // } // // private void initData() { // defaultSize = dp2px(100); // // mPadding = dp2px(30); // topCompensatePadding = dp2px(5); // // buttonWidth = dp2px(10); // mPercent = 0.0f; // mProgress = 0; // mMaxValue = 100; // mMinValue = 0; // // mCornerRadius = dp2px(2); // mProgressBarUnitSring = DEFAULT_ARC_PROGRESS_BAR_UNIT_STRING; // isProgressTextShow = true; // } // // private void initPaint() { // curtainPath = new Path(); // // curtainPaint = new Paint(); // curtainPaint.setColor(curtainColor); // curtainPaint.setAntiAlias(true);//设置抗锯齿 // curtainPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); // // circlePaint = new Paint(); // circlePaint.setColor(bgColor); // circlePaint.setAntiAlias(true);//设置抗锯齿 // // initTextPanit(); // } // // // 初始化拖动按钮顶部文字画笔和进度圆弧画笔 // private void initTextPanit() { // mTextPaint = new Paint(); // mTextPaint.setAntiAlias(true); // mTextPaint.setStrokeWidth(1); // mTextPaint.setTextSize(getTextSizeDip(20)); // mTextPaint.setColor(Color.BLACK); // mTextPaint.setTextAlign(Paint.Align.CENTER); // } // //// public HDLcurtainSeekBar(Context context, @Nullable AttributeSet attrs) { //// super(context, attrs); //// init(context,attrs); //// } // // private void initAttrs(Context context,AttributeSet attrs){ // TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HDLCurtainSeekBar); // curtainWidth = typedArray.getDimension(R.styleable.HDLCurtainSeekBar_curtain_bar_width, dp2px(80)); // curtainHeight = typedArray.getDimension(R.styleable.HDLCurtainSeekBar_curtain_bar_height,dp2px(15)); // curtainColor = typedArray.getColor(R.styleable.HDLCurtainSeekBar_curtain_bar_color, DEFAULT_WAVE_COLOR); //// secondWaveColor = typedArray.getColor(R.styleable.HDLWaveSeekBar_second_wave_color,getResources().getColor(R.color.light)); // bgColor = typedArray.getColor(R.styleable.HDLCurtainSeekBar_curtain_bar_bg_color, DEFAULT_WAVE_BACKGROUND); // // typedArray.recycle(); // } // // private int dp2px(int dp) { // return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics()); // } // // private float getTextSizeDip(float value) { // return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, getResources().getDisplayMetrics()); // } // // // private void oncurtainSizeChange(){ // mcurtainViewWidth = mSeekBarWidth - mPadding*2; // mcurtainViewHeight = mSeekBarHeight - mPadding*2; // mCurtainLeftAndTop = mPadding; // mCurtainRight = mSeekBarWidth - mPadding; // mCurtainBottom = mSeekBarHeight - mPadding; // buttonWidth = mcurtainViewWidth/4; // updateBitmapImage(); // } // // private void updateBitmapImage(){ // // bgBitmapCurtain= BitmapFactory.decodeResource(getResources(), R.drawable.ic_wd_curtain_bg_top); // bgBitmapCurtain = resizeImage(bgBitmapCurtain, (int)mSeekBarWidth-mPadding*2 + topCompensatePadding*2, (int)mPadding+2); // // bgBitmapButton = BitmapFactory.decodeResource(getResources(), R.drawable.ic_wd_curtain_open); // bgBitmapButton = resizeImage(bgBitmapButton, (int) buttonWidth, (int) buttonWidth); // // } // // @Override // protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); // // int ws = MeasureSpec.getSize(widthMeasureSpec); //取出宽度的确切数值 // int wm = MeasureSpec.getMode(widthMeasureSpec); //取出宽度的测量模式 // int hs = MeasureSpec.getSize(heightMeasureSpec); //取出高度的确切数值 // int hm = MeasureSpec.getMode(heightMeasureSpec); //取出高度的测量模 // // if (wm == MeasureSpec.UNSPECIFIED) { // wm = MeasureSpec.EXACTLY; // ws = dp2px(DEFAULT_EDGE_LENGTH); // } else if (wm == MeasureSpec.AT_MOST) { // wm = MeasureSpec.EXACTLY; // ws = Math.min(dp2px(DEFAULT_EDGE_LENGTH), ws); // } // if (hm == MeasureSpec.UNSPECIFIED) { // hm = MeasureSpec.EXACTLY; // hs = dp2px(DEFAULT_EDGE_LENGTH); // } else if (hm == MeasureSpec.AT_MOST) { // hm = MeasureSpec.EXACTLY; // hs = Math.min(dp2px(DEFAULT_EDGE_LENGTH), hs); // } // setMeasuredDimension(MeasureSpec.makeMeasureSpec(ws, wm), MeasureSpec.makeMeasureSpec(hs, hm)); // // mSeekBarHeight = hs; // mSeekBarWidth = ws; // mCenterX = mSeekBarWidth/2; // mCenterY = mSeekBarHeight/2; // oncurtainSizeChange(); // } // // private int measureSize(int defaultSize,int measureSpec) { // int result = defaultSize; // int specMode = MeasureSpec.getMode(measureSpec); // int specSize = MeasureSpec.getSize(measureSpec); // // if (specMode == MeasureSpec.EXACTLY) { // result = specSize; // } else if (specMode == MeasureSpec.AT_MOST) { // result = Math.min(result, specSize); // } // return result; // } // // @Override // protected void onSizeChanged(int w, int h, int oldw, int oldh) { // super.onSizeChanged(w, h, oldw, oldh); // // 计算在当前大小下,内容应该显示的大小和起始位置 // int safeW = w - getPaddingLeft() - getPaddingRight(); // int safeH = h - getPaddingTop() - getPaddingBottom(); // mSeekBarHeight = safeH; // mSeekBarWidth = safeW; // mCenterX = mSeekBarWidth/2; // mCenterY = mSeekBarHeight/2; // oncurtainSizeChange(); // // Log.i("getCurrentProgress ","mSeekBarHeight :Y " + mSeekBarHeight + " mSeekBarWidth:"+mSeekBarWidth); // } // // // // @SuppressLint("DrawAllocation") // @Override // protected void onDraw(Canvas canvas) { // super.onDraw(canvas); // // canvas.save(); // //// //画圆角矩形 //// RectF rectF = new RectF(mBorderLeftAndTop, mBorderLeftAndTop, mSeekBarWidth - mBorderLeftAndTop, mSeekBarHeight-mBorderLeftAndTop); //// canvas.drawRoundRect(rectF, mCornerRadius, mCornerRadius, mBorderPaint); // // bitmap = Bitmap.createBitmap((int)mSeekBarWidth, (int)mSeekBarHeight, Bitmap.Config.ARGB_8888); // bitmapCanvas = new Canvas(bitmap); // // RectF rectF2 = new RectF(mCurtainLeftAndTop, mCurtainLeftAndTop, mCurtainRight, mCurtainBottom); // bitmapCanvas.drawRoundRect(rectF2, mCornerRadius, mCornerRadius, circlePaint); // //// bitmapCanvas.drawCircle(mcurtainViewWidth/2, mcurtainViewWidth/2, mcurtainViewWidth/2, circlePaint); // bitmapCanvas.drawPath(getCurtainPath(), curtainPaint); //// if(isDrawSecondcurtain){ //// bitmapCanvas.drawPath(getSecondcurtainPath(),secondcurtainPaint); //// } // // // canvas.drawBitmap(bitmap, 0, 0, null); // // if(isProgressTextShow) { // canvas.drawText(String.valueOf(getProgress()) + mProgressBarUnitSring, mCenterX, mCenterY, mTextPaint); // // } // // // canvas.drawBitmap(bgBitmapCurtain, mPadding- topCompensatePadding, 0, new Paint()); // // // canvas.drawBitmap(bgBitmapButton, mSeekBarWidth/2 - bgBitmapButton.getWidth()/2.0F, nowY - bgBitmapButton.getHeight()/2.0F, new Paint()); // // canvas.restore(); // // } // // // public Bitmap getBitmap(int resId) { // BitmapFactory.Options options = new BitmapFactory.Options(); // TypedValue value = new TypedValue(); // getResources().openRawResource(resId, value); // options.inTargetDensity = value.density; // options.inScaled = false;//不缩放 // return BitmapFactory.decodeResource(getResources(), resId, options); // } // // public Bitmap resizeImage(Bitmap bitmap, int width, int height) // { // int bmpWidth = bitmap.getWidth(); // int bmpHeight = bitmap.getHeight(); // // float scaleWidth = ((float) width) / bmpWidth; // float scaleHeight = ((float) height) / bmpHeight; // // Matrix matrix = new Matrix(); // matrix.postScale(scaleWidth, scaleHeight); // // return Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true); // } // // //--- 初始化结束 ------------------------------------------------------------------------------- // // //--- 状态存储 --------------------------------------------------------------------------------- // private static final String KEY_PROGRESS_PRESENT = "PRESENTWAVE"; // 用于存储和获取当前百分比 // @Override // protected Parcelable onSaveInstanceState() { // Bundle bundle = new Bundle(); // bundle.putParcelable("superState", super.onSaveInstanceState()); // bundle.putFloat(KEY_PROGRESS_PRESENT, mProgress); // return bundle; // } // // @Override // protected void onRestoreInstanceState(Parcelable state) { // if (state instanceof Bundle) { // Bundle bundle = (Bundle) state; // this.mProgress = bundle.getInt(KEY_PROGRESS_PRESENT); // state = bundle.getParcelable("superState"); // } // if (null != mOnProgressChangeListener) { // mOnProgressChangeListener.onProgressChanged(this, this.mProgress, false); // } // super.onRestoreInstanceState(state); // } // // //--- 状态存储结束 ----------------------------------------------------------------------------- // // private Path getCurtainPath(){ // // nowY = (mPercent)*mcurtainViewHeight + mCurtainLeftAndTop; // // curtainPath.reset(); // // //移动到右上方,也就是p0点 // curtainPath.moveTo(mCurtainRight, mCurtainLeftAndTop); // //移动到右下方,也就是p1点 // curtainPath.lineTo(mCurtainRight, nowY); // //移动到左下边,也就是p2点 // curtainPath.lineTo(mCurtainLeftAndTop, nowY); // //移动到左上方,也就是p3点 // //curtainPath.lineTo(0, (1-mPercent)*mcurtainViewWidth); //// curtainPath.lineTo(-curtainMovingDistance, (1-mPercent)*mSeekBarHeight); // //// if(mPercent == 0 || mPercent ==1){ //// curtainPath.lineTo(mCurtainLeftAndTop, nowY); //// }else { //// curtainPath.lineTo(-curtainMovingDistance, nowY); //// //从p3开始向p0方向绘制波浪曲线 //// for (int i = 0; i < curtainNum * 2; i++) { //// curtainPath.rQuadTo(curtainWidth / 2, changecurtainHeight, curtainWidth, 0); //// curtainPath.rQuadTo(curtainWidth / 2, -changecurtainHeight, curtainWidth, 0); //// } //// } // // curtainPath.lineTo(mCurtainLeftAndTop, mCurtainLeftAndTop); // // //将path封闭起来 // curtainPath.close(); // // // // return curtainPath; // } // // // private boolean mCanDrag = false; // 是否允许拖动 // private boolean moved = false; // 是否允许 // private int lastProgress = -1; // // @SuppressLint("ClickableViewAccessibility") // @Override // public boolean onTouchEvent(MotionEvent event) { // super.onTouchEvent(event); // if(!isClickable) return false; // int action = event.getActionMasked(); // switch (action) { // case ACTION_DOWN: // moved = false; // judgeCanDrag(event); // if (null != mOnProgressChangeListener) { // mOnProgressChangeListener.onStartTrackingTouch(this); // } // break; // case ACTION_MOVE: // if (!mCanDrag) { // break; // } // setCurrentPercent(event); // // 事件回调 // if (null != mOnProgressChangeListener && mProgress != lastProgress) { // mOnProgressChangeListener.onProgressChanged(this, mProgress, true); // lastProgress = mProgress; // } // moved = true; // break; // case ACTION_UP: // case ACTION_CANCEL: // if(!moved){ // if (isInArcProgress(event.getX(),event.getY())) { // setCurrentPercent(event); // } // } // if (null != mOnProgressChangeListener) { // mOnProgressChangeListener.onStopTrackingTouch(this); // } // break; // } // // invalidate(); // return true; // } // // // // 判断是否允许拖动 // private void judgeCanDrag(MotionEvent event) { // if(isInArcProgress(event.getX(),event.getY())){ // mCanDrag = true; // }else { // mCanDrag = false; // } // } // // private void setCurrentPercent(MotionEvent event) { //// Log.i("getCurrentProgress ","getCurrentProgress :Y " + event.getY() + " X:"+event.getX()); // float progressY = event.getY() - mCurtainLeftAndTop; // float progress = progressY /mcurtainViewHeight; //// progress = 1 - progress; // if (progress < 0) progress = 0; // if (progress > 1) progress = 1; // mPercent = progress; // mProgress = (int) (mPercent * (mMaxValue - mMinValue)) + mMinValue; // // } // // private boolean isInArcProgress(float px ,float py) { // // if(px < 0 || px > mSeekBarWidth || py < 0 || py > mSeekBarHeight){ // return false; // }else { // return true; // } // } // // // // // endregion ----------------------------------------------------------------------------------- // // region 状态回调 ------------------------------------------------------------------------------ // // private HDLCurtainSeekBar.OnProgressChangeListener mOnProgressChangeListener; // // public void setOnProgressChangeListener(HDLCurtainSeekBar.OnProgressChangeListener onProgressChangeListener) { // mOnProgressChangeListener = onProgressChangeListener; // } // // public interface OnProgressChangeListener { // /** // * 进度发生变化 // * // * @param seekBar 拖动条 // * @param progress 当前进度数值 // * @param isUser 是否是用户操作, true 表示用户拖动, false 表示通过代码设置 // */ // void onProgressChanged(HDLCurtainSeekBar seekBar, int progress, boolean isUser); // // /** // * 用户开始拖动 // * // * @param seekBar 拖动条 // */ // void onStartTrackingTouch(HDLCurtainSeekBar seekBar); // // /** // * 用户结束拖动 // * // * @param seekBar 拖动条 // */ // void onStopTrackingTouch(HDLCurtainSeekBar seekBar); // } // // endregion ----------------------------------------------------------------------------------- // // // //****************************对外接口**************************************************** // /** // * 设置控件是否可用点击 // * @param isClickable // */ // public void setIsClickable(Boolean isClickable) { // this.isClickable = isClickable; // } // // public int getProgress() { // return mProgress; // } // // public void setProgress(int progress) { // System.out.println("setProgress = " + progress); // if (progress > mMaxValue) progress = mMaxValue; // if (progress < mMinValue) progress = mMinValue; // mProgress = progress; // mPercent = (progress - mMinValue) * 1.0f / (mMaxValue - mMinValue); // System.out.println("setProgress present = " + progress); // if (null != mOnProgressChangeListener) { // mOnProgressChangeListener.onProgressChanged(this, progress, false); // } // postInvalidate(); // // } // // /** // * 进度文字大小 // * @param textSize // */ // public void setProgressTextSize(int textSize){ // mTextPaint.setTextSize(getTextSizeDip(textSize)); // } // // /** // * 进度文字颜色 // * @param textPaintColor // */ // public void setProgressTextColor(int textPaintColor){ // mTextPaint.setColor(textPaintColor); // } // // /** // * 设置进度显示值单位 // * // * @param progressBarUnitSring 进度显示值单位 // */ // public void setProgressBarUnitSring(String progressBarUnitSring) { // mProgressBarUnitSring = progressBarUnitSring; // } // // /** // * 设置最大数值 // * // * @param max 最大数值 // */ // public void setMaxValue(int max) { // mMaxValue = max; // } // // /** // * 设置最小数值 // * // * @param min 最小数值 // */ // public void setMinValue(int min) { // mMinValue = min; // } // //// public void setBorderWidth(int borderWidth) { //// mBorderWidth = dp2px(borderWidth); //// mBorderPaint.setStrokeWidth(mBorderWidth); //// oncurtainSizeChange(); //// postInvalidate(); //// } // // // public void setCurtainColor(int mCurtainColor){ // curtainColor = mCurtainColor; // curtainPaint.setColor(curtainColor); // // } // //// public void setCurtainBorderColor(int mmBorderColor){ //// mBorderColor = mmBorderColor; //// mBorderPaint.setColor(mBorderColor); //// } // // public void setCurtainBgColor(int mBgColor){ // bgColor = mBgColor; // circlePaint.setColor(bgColor); // } // // public void setCurtainPadding(int mmPadding){ // mPadding = dp2px(mmPadding); // oncurtainSizeChange(); // } // // public void setCornerRadius(int mmCornerRadius){ // mCornerRadius = dp2px(mmCornerRadius); // // } // // public void setProgressTextShow(Boolean progressTextShow) { // isProgressTextShow = progressTextShow; // } // // public void setTopCompensatePadding(int topCompensatePadding) { // this.topCompensatePadding = topCompensatePadding; // oncurtainSizeChange(); // } //}