【问题标题】:Faster gesture feedback for onScroll更快的 onScroll 手势反馈
【发布时间】:2018-01-02 09:10:50
【问题描述】:

我有一个视频文件,想让用户通过左右滑动手势来回播放。用户体验应该是流畅的,如果视频文件包含从左到右的静态场景,用户应该有他在图片上左右滚动的印象(部分来自光照变化)。这是我目前拥有的代码。

private GestureDetectorCompat mDetector;
private long lengthTourMs;
private long currentPositionMs;
private FFmpegMediaMetadataRetriever mmr;
ImageView video;

@Override
protected void onCreate(Bundle savedInstanceState) {

    video = (ImageView)findViewById(R.id.video_frame);

    mDetector = new GestureDetectorCompat(this, new SwipeGestureListener());

    mmr = new FFmpegMediaMetadataRetriever();
    mmr.setDataSource(this, Uri.parse("path/to/video/file"));
    lengthTourMs = Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
    currentPositionMs = 2000;
    Bitmap frame = mmr.getFrameAtTime(currentPositionMs * 1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
    video.setImageBitmap(frame); 
}


class SwipeGestureListener extends GestureDetector.SimpleOnGestureListener {
  private static final String TAG = "Gestures";

  @Override
  public boolean onScroll(MotionEvent event1, MotionEvent event2,
      float distanceX, float distanceY) {
    Log.d(TAG, "onScroll: " + String.valueOf(distanceX));

    currentPositionMs += (long)distanceX;
    currentPositionMs += lengthTourMs;
    currentPositionMs %= lengthTourMs;
    Bitmap frame = mmr.getFrameAtTime(currentPositionMs * 1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
    Log.d(TAG, "currentPositionMs: " + String.valueOf(currentPositionMs));
      video.setImageBitmap(frame);
    return true;
  }
}

问题在于,正常的向右/向左滑动手势会调用大约 2 到 3 次 onScroll ,因此上述代码的结果只是用户看到的两到三帧,而不是所有流畅的视频般的体验。

有没有办法为 onScroll 之类的手势提供更多/更快的反馈?我也愿意接受其他解决问题的建议。

【问题讨论】:

    标签: android video-processing interactive onscroll mediametadataretriever


    【解决方案1】:

    我用OnTouchListener 为ImageView 解决了这个问题。

    private int x,y;
    private long lengthTourMs;
    private long currentPositionMs;
    private FFmpegMediaMetadataRetriever mmr;
    ImageView video = (ImageView)findViewById(R.id.video_frame);
    
    video.setOnTouchListener( new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        int xx,changeX;
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            x = (int) event.getX();
            break;
          case MotionEvent.ACTION_MOVE:
            xx = (int) event.getX();
            changeX = x - xx;
            currentPositionMs += changeX;
            currentPositionMs += lengthTourMs;
            currentPositionMs %= lengthTourMs;
            video.setImageBitmap(mmr.getFrameAtTime(currentPositionMs * 1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST));
            x = xx;
            break;
          default:
            break;
        }
        return true;
      }
    });
    

    我实际上不再使用FFmpegeMediaMetadataRetriever,因为它会降低实时搜索的速度,但这是另一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多