ShuangXue12 2022-02-21 10:38 采纳率: 0%
浏览 13

Android 如何自定义一个垂直进度条,去移动动画(上下移动,移动范围有限制)

问题遇到的现象和发生背景

公司需求,左边需要自定义一个垂直进度条,右边是一个半截的车体,上面有个窗户,想通过拖动进度条然后窗户随之移动

问题相关代码,请勿粘贴截图

//自定义的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

  • 写回答

1条回答 默认 最新

  • 清雨夜风 2022-02-21 11:35
    关注

    seekBar或者progressBar都可以你所说的seekBar的一些东西无法使用,具体是哪些呢?

    评论

报告相同问题?

问题事件

  • 创建了问题 2月21日

悬赏问题

  • ¥15 求推荐发表需要付费的深度学习遥感场景分类SCI期刊
  • ¥15 无法在java控制台录入文字
  • ¥15 flutter网页应用用python的http服务器访问速度慢
  • ¥15 VESTA绘图原子颜色显示异常
  • ¥15 天翼云搭建多ip l2tp
  • ¥15 python实现CAD识图
  • ¥15 如何实现在renpy中创建并应用不同大小尺寸对话框?
  • ¥15 table表格有一列是固定列 滑动到最下面时 固定的那一列有几行没显示出来
  • ¥20 单细胞数据注释时报错
  • ¥15 vscode编译ros找不到头文件,cmake.list文件出问题,如何解决?(语言-c++|操作系统-linux)