1

实际上我想连续增加/减少音量,当我向上/向下滑动手指时。我想当我慢慢向上移动手指时,音量随着手指移动而增加,在手指向下的情况下减少。但是当我只向上滑动一次手指时,我的代码会增加音量。我需要再次向上滑动以增加更多音量。它不会随着手指的移动而持续增加。

请帮助我如何做到这一点。请检查我的代码有什么错误。请帮忙谢谢。

OnSwipeTouchListener.java (类)

public class OnSwipeTouchListener implements OnTouchListener {

private final GestureDetector gestureDetector;

public OnSwipeTouchListener (Context ctx){
    gestureDetector = new GestureDetector(ctx, new GestureListener());
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        onSwipeRight();
                    } else {
                        onSwipeLeft();
                    }
                    result = true;
                }
            }
            else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffY > 0) {
                    onSwipeBottom();
                } else {
                    onSwipeTop();
                }
                result = true;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }

}

public void onSwipeRight() {
}

public void onSwipeLeft() {
}

public void onSwipeTop() {
}

public void onSwipeBottom() {
}

}

VideoView.java(活动)

 fullview = (View)findViewById(R.id.fullView);
        fullview.setOnTouchListener(new OnSwipeTouchListener(ViewVideo.this) {
            public void onSwipeTop() {
                Toast.makeText(ViewVideo.this, "top", Toast.LENGTH_SHORT).show();
                currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume + 1, 0);
            }
            public void onSwipeRight() {
                Toast.makeText(ViewVideo.this, "right", Toast.LENGTH_SHORT).show();
            }
            public void onSwipeLeft() {
                Toast.makeText(ViewVideo.this, "left", Toast.LENGTH_SHORT).show();
            }
            public void onSwipeBottom() {
                Toast.makeText(ViewVideo.this, "bottom", Toast.LENGTH_SHORT).show();
                currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume - 1, 0);
            }

        });
4

1 回答 1

1

您需要实施的是加权阈值。即当前,每当您检测到用户正在向上滑动时,您都会触发 swipeUp 音量 1。您感兴趣的是更详细一点,您希望根据用户向上滑动的多少(即重量)增加音量。

到目前为止,代码很好,可以使用一些修改来实现这一点。尤其:

  1. 在您onScroll或在辅助方法中确定用户向上滑动的数量/重量,而不仅仅是他们是否超过了阈值

  2. 将此权重传递给被覆盖的方法onSwipeTop(),然后这些方法必须使用此值以及AudioManager 查看官方 android 文档中的最大值来调整音量(即您可能正在做 +1、+2 等)

  3. api 文档确实记录了如何将标志与setStreamVolume. 我看到你总是使用0which 相当于ADJUST_SAME. 你可以考虑分别合并ADJUST_RAISEADJUST_LOWER
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume - 1, 0);

确定“重量”(调整音量的多少)

您可以使用多种方法来确定权重。这些示例假设您之前定义SWIPE_VERTICAL_INCREMENT为整数增量值来调整您的权重。您可以将此值呈现为小整数,或者您可以选择根据设备的屏幕尺寸来确定它(有利于旋转体验阅读更多...)。

方法一

一种方法是在您检测到它们已经通过之后,SWIPE_THRESHOLD您可以使用阈值与滚动量之间的差异来确定重量。

if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
               int swipeVerticalWeighting = (int)((Math.abs(diffY) - SWIPE_THRESHOLD) / SWIPE_VERTICAL_INCREMENT);
                if (diffY > 0) {
                    onSwipeBottom(swipeVerticalWeighting );
                } else {
                    onSwipeTop(swipeVerticalWeighting );
                }
                result = true;
}

方法二

另一种方法是在您检测到他们已经通过之后,SWIPE_THRESHOLD您可以使用他们滚动多少之间的差异来确定重量。

if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
               int swipeVerticalWeighting = (int)(Math.abs(diffY) / SWIPE_VERTICAL_INCREMENT);
                if (diffY > 0) {
                    onSwipeBottom(swipeVerticalWeighting );
                } else {
                    onSwipeTop(swipeVerticalWeighting );
                }
                result = true;
}

根据先前计算的重量更改体积

注意。您必须更新签名和覆盖onSwipeBottomonSwipeTop适应此。

最后,您可以根据权重调整音量。根据音量变化,可能会出现SecurityException 或其他情况,应考虑禁止某些应用在未经用户许可的情况下超过音量阈值的“安全最大音量” (这也是可配置的)。

public void onSwipeTop(int increaseVolumeBy) {
                Toast.makeText(ViewVideo.this, "top", Toast.LENGTH_SHORT).show();
                currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
                //feel free to retrieve the max volume elsewhere, it should not change frequently
               int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//ensure volume being increased by is not more than the max volume
              int nextVolume = currentVolume + increaseVolumeBy;
              if(nextVolume > maxVolume){

                 nextVolume = maxVolume;

              }
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, nextVolume, AudioManager.ADJUST_RAISE);
}

总体而言,您需要根据向上滑动的方式以及应给予的权重来决定希望将音量增加多少。这可能因您交付的应用程序类型和您的预期用户而异。

于 2020-05-28T16:25:29.257 回答