问题遇到的现象和发生背景
公司需求,左边需要自定义一个垂直进度条,右边是一个半截的车体,上面有个窗户,想通过拖动进度条然后窗户随之移动
问题相关代码,请勿粘贴截图
//自定义的seekbar
@SuppressLint("AppCompatCustomView")
public class VerticalSeekBar extends SeekBar {
public VerticalSeekBar(Context context) {
super(context);
}
public VerticalSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw);
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
protected void onDraw(Canvas canvas) {
canvas.rotate(-90);
canvas.translate(-getHeight(), 0);
//getProgressDrawable().setAlpha(0);
super.onDraw(canvas);
}
@Override
public synchronized void setProgress(int progress) {
super.setProgress(progress);
onSizeChanged(getWidth(), getHeight(), 0, 0);
}
public void setInCrease(int increase){
setProgress(getProgress() + increase);
}
public void setProgressDrawableAlpha(int alpha){
getProgressDrawable().setAlpha(alpha);
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
int i=0;
i=getMax() - (int)(getMax() * event.getY() / getHeight());
setProgress(i);
Log.i("Progress",getProgress()+"");
onSizeChanged(getWidth(),getHeight(), 0, 0);
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
}
//mainactivity里的相关操作
skylightSeekbar!!.setOnSeekBarChangeListener(object :SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
Log.i("zyl","start animation")
// if (seekBar!!.progress<20) return
AnimationUtil.skylightAnim(ivWindSky!!)
}
})
我的解答思路和尝试过的方法
我先去写了一个自定义的seekbar(如上面VerticalSeekBar),上面这个自定义方法可以显示出垂直的seekbar,但是seekbar里的一些东西无法使用,
我想要达到的结果
如图:https://img-mid.csdnimg.cn/release/static/image/mid/ask/071260114546126.png