Swpie up音量正在增加但是如果我向上移动手指则不会持续增加

时间:2017-09-12 20:31:12

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

实际上,当我向上/向下滑动手指时,我想连续增大/减小音量。我希望当我慢慢地向上移动手指然后用手指移动增加音量并减少手指向下情况。 但是当我只用手指向上滑动一次时,我的代码会增加音量。我需要再次向上滑动以增加音量。随着手指移动,它不会继续增加。

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

OnSwipeTouchListener.java (Class)

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

        });

1 个答案:

答案 0 :(得分:1)

您需要实现的是加权阈值。也就是说,当前每当您检测到用户向上滑动时,您就会将swipeUp音量触发1。您感兴趣的是更详细的信息,您想根据用户向上滑动的数量(即体重)来进一步增加音量。

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

  1. 在您的onScroll或帮助方法中,确定用户轻拂了多少/重量,而不仅仅是他们是否已超过阈值

  2. 将此权重传递给覆盖的方法onSwipeTop(),然后他们必须使用此值以及AudioManager see official android docs中的最大值来调整音量(即您可能会做+ 1,+ 2等)

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

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

您可以使用几种方法来确定权重。这些示例假定您先前将SWIPE_VERTICAL_INCREMENT定义为用于调整权重的整数增量值。您可以使用小整数形式显示此值,也可以根据设备的屏幕尺寸确定此值(对于旋转体验read more...很有用)。

方法1

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

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

NB。您必须更新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);
}

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