Recently Added

6/recent/ticker-posts

Pinch to Zoom in, out and Double Tap to forward and backward in Video player App Part 12

In this Video Player App Part 12 I am going to show you how you can zoom in and zoom out using pinch and also implement double-tap to go forward and backward and single tap to hideDefaultControls and showDefaultControls
So let's start.



Add this code in your Videoplayer.java and watch Tutorials for better understanding.

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GestureDetectorCompat;

import android.graphics.Point;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.widget.VideoView;

import com.example.player.R;

import static com.example.player.adapter.VideosAdapter.videoFolder;

public class VideoPlayer extends AppCompatActivity
implements View.OnTouchListener,
ScaleGestureDetector.OnScaleGestureListener {

int position = -1;
private VideoView videoView;
LinearLayout one, two , three , four;


RelativeLayout zoomLayout;
ScaleGestureDetector scaleDetector;
GestureDetectorCompat gestureDetector;
private static final float MIN_ZOOM = 1.0f;
private static final float MAX_ZOOM = 5.0f;
boolean intLeft, intRight;
private Display display;
private Point size;
private Mode mode = Mode.NONE;
private enum Mode {
NONE,
DRAG,
ZOOM
}
int device_width;
private int sWidth;
private boolean isEnable = true;
private float scale = 1.0f;
private float lastScaleFactor = 0f;
// Where the finger first touches the screen
private float startX = 0f;
private float startY = 0f;
// How much to translate the canvas
private float dx = 0f;
private float dy = 0f;
private float prevDx = 0f;
private float prevDy = 0f;

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
hideDefaultControls();
if (scale > MIN_ZOOM) {
mode = Mode.DRAG;
startX = event.getX() - prevDx;
startY = event.getY() - prevDy;
}
break;
case MotionEvent.ACTION_MOVE:
hideDefaultControls();
isEnable = false;
if (mode == Mode.DRAG) {
dx = event.getX() - startX;
dy = event.getY() - startY;
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
mode = Mode.ZOOM;
break;
case MotionEvent.ACTION_POINTER_UP:
mode = Mode.DRAG;
break;
case MotionEvent.ACTION_UP:
mode = Mode.NONE;
prevDx = dx;
prevDy = dy;
break;
}
scaleDetector.onTouchEvent(event);
gestureDetector.onTouchEvent(event);
if ((mode == Mode.DRAG && scale >= MIN_ZOOM) || mode == Mode.ZOOM) {
zoomLayout.requestDisallowInterceptTouchEvent(true);
float maxDx = (child().getWidth() - (child().getWidth() / scale)) / 2 * scale;
float maxDy = (child().getHeight() - (child().getHeight() / scale)) / 2 * scale;
dx = Math.min(Math.max(dx, -maxDx), maxDx);
dy = Math.min(Math.max(dy, -maxDy), maxDy);
applyScaleAndTranslation();
}
return true;
}

private void applyScaleAndTranslation() {
child().setScaleX(scale);
child().setScaleY(scale);
child().setTranslationX(dx);
child().setTranslationY(dy);
}

private View child() {
return zoomLayout(0);
}

private View zoomLayout(int i) {
return videoView;
}



@Override
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = scaleDetector.getScaleFactor();
if (lastScaleFactor == 0 || (Math.signum(scaleFactor) == Math.signum(lastScaleFactor))) {
scale *= scaleFactor;
scale = Math.max(MIN_ZOOM, Math.min(scale, MAX_ZOOM));
lastScaleFactor = scaleFactor;
} else {
lastScaleFactor = 0;
}
return true;
}

@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}

@Override
public void onScaleEnd(ScaleGestureDetector detector) { }




@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_player);

videoView = findViewById(R.id.video_view);
one = findViewById(R.id.videoView_one_layout);
two = findViewById(R.id.videoView_two_layout);
three = findViewById(R.id.videoView_three_layout);
four = findViewById(R.id.videoView_four_layout);

position = getIntent().getIntExtra("p", -1);
String path = videoFolder.get(position).getPath();
if (path!=null){
videoView.setVideoPath(path);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
videoView.start();
}
});
}else {
Toast.makeText(this, "path didn't exits", Toast.LENGTH_SHORT).show();
}

zoomLayout = findViewById(R.id.zoom_layout);
display = getWindowManager().getDefaultDisplay();
size = new Point();
display.getSize(size);
sWidth = size.x;
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
device_width = displayMetrics.widthPixels;
zoomLayout.setOnTouchListener(this);
scaleDetector = new ScaleGestureDetector(getApplicationContext(), this);
gestureDetector = new GestureDetectorCompat(getApplicationContext(), new GestureDetector());


}

private class GestureDetector extends android.view.GestureDetector.SimpleOnGestureListener{

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (isEnable){
hideDefaultControls();
isEnable = false;
}else {
showDefaultControls();
isEnable = true;
}
return super.onSingleTapConfirmed(e);
}

@Override
public boolean onDoubleTap(MotionEvent event) {
if (event.getX() < (sWidth / 2)) {
intLeft = true;
intRight = false;
videoView.seekTo(videoView.getCurrentPosition() - 20000);
Toast.makeText(VideoPlayer.this, "-20sec", Toast.LENGTH_SHORT).show();
} else if (event.getX() > (sWidth / 2)) {
intLeft = false;
intRight = true;
videoView.seekTo(videoView.getCurrentPosition() + 20000);
Toast.makeText(VideoPlayer.this, "+20sec", Toast.LENGTH_SHORT).show();
}
return super.onDoubleTap(event);
}


}

private void hideDefaultControls(){
one.setVisibility(View.GONE);
two.setVisibility(View.GONE);
three.setVisibility(View.GONE);
four.setVisibility(View.GONE);
//Todo this function will hide status and navigation when we click on screen
final Window window = this.getWindow();
if (window == null){
return;
}
window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
final View decorView = window.getDecorView();
if (decorView!=null){
int uiOption = decorView.getSystemUiVisibility();
if (Build.VERSION.SDK_INT >= 14) {
uiOption |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
if (Build.VERSION.SDK_INT >= 16) {
uiOption |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
if (Build.VERSION.SDK_INT >= 19) {
uiOption |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
decorView.setSystemUiVisibility(uiOption);
}
}

private void showDefaultControls(){
one.setVisibility(View.VISIBLE);
two.setVisibility(View.VISIBLE);
three.setVisibility(View.VISIBLE);
four.setVisibility(View.VISIBLE);
//todo this function will show status and navigation when we click on screen
final Window window = this.getWindow();
if (window == null){
return;
}
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
final View decorView = window.getDecorView();
if (decorView!=null){
int uiOption = decorView.getSystemUiVisibility();
if (Build.VERSION.SDK_INT >= 14) {
uiOption &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
if (Build.VERSION.SDK_INT >= 16) {
uiOption &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
if (Build.VERSION.SDK_INT >= 19) {
uiOption &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
decorView.setSystemUiVisibility(uiOption);
}
}

}
Watch Full Tutorials

hereman

Post a Comment

0 Comments