【问题标题】:On Swipe up Volume Is increasing but do not increase continious if i move finger up向上滑动音量正在增加,但如果我向上移动手指,则不会连续增加
【发布时间】:2020-05-29 02:41:00
【问题描述】:

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

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

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);
            }

        });

【问题讨论】:

    标签: android android-video-player android-gesture android-touch-event


    【解决方案1】:

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

    到目前为止,代码很好,可以使用一些修改来实现这一点。值得注意的是:

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

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

    确定“重量”(调整音量的大小)

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

    方法一

    一种方法是在您检测到它们已通过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;
    }
    

    方法2

    另一种方法是在您检测到他们已经通过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 or others"safe max volume ",它禁止某些应用在未经用户许可的情况下超过音量阈值(这也是可配置的)。

    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);
    }
    

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

    【讨论】:

    • 当我尝试没有增加音量或Toast & 我使用SWIPE_VERTICAL_INCREMENT = 10 我应该怎么做
    • 您可以为SWIPE_VERTICAL_INCREMENT 尝试较小的值,或者将垂直加权直接作为int swipeVerticalWeighting = (int)(Math.abs(diffY) / SWIPE_VERTICAL_INCREMENT); 的原始滑动结果的结果
    • 在调试模式下运行以查看值的变化或使用“日志”可以让您进一步了解调整垂直权重的幅度。一旦你得到这个工作,另一个因素是设备屏幕尺寸,即根据设备屏幕尺寸调整SWIPE_VERTICAL_INCREMENT
    • 你能用上面的代码更新答案吗,public void onSwipeTop(int increaseVolumeBy) {} 不会增加音量
    • 我会及时实现概念验证并上传代码
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2016-07-21
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多