boolean onDoubleTap(MotionEvent e)
解释:双击的第二下Touch down时触发
boolean onDoubleTapEvent(MotionEvent e)
解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。
boolean onDown(MotionEvent e)
解释:Touch down时触发
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
解释:Touch了滑动一点距离后,up时触发。
void onLongPress(MotionEvent e)
解释:Touch了不移动一直Touch down时触发
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
解释:Touch了滑动时触发。
void onShowPress(MotionEvent e)
解释:Touch了还没有滑动时触发
(与onDown,onLongPress比较
onDown只要Touch down一定立刻触发。
而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
使用GestureDetector需要在View中重写onTouchEvent事件,例如:
- GestureDetector mGesture = null;
- @Override
- public boolean onTouch(View v, MotionEvent event)
- {
- // TODO Auto-generated method stub
- return mGesture.onTouchEvent(event);
- }
详细的测试例子如下:
- package com.jiubang.android.gesturetest;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.GestureDetector;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.GestureDetector.SimpleOnGestureListener;
- import android.view.View.OnTouchListener;
- import android.widget.Button;
- public class GestureActivity extends Activity
- implements OnTouchListener
- {
- private Button mButton = null;
- GestureDetector mGesture = null;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Log.i("TEST", "onCreate");
- mButton = (Button)findViewById(R.id.button1);
- mButton.setOnTouchListener(this);
- mGesture = new GestureDetector(this, new GestureListener());
- }
- @Override
- public boolean onTouch(View v, MotionEvent event)
- {
- // TODO Auto-generated method stub
- return mGesture.onTouchEvent(event);
- }
- class GestureListener extends SimpleOnGestureListener
- {
- @Override
- public boolean onDoubleTap(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onDoubleTap");
- return super.onDoubleTap(e);
- }
- @Override
- public boolean onDown(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onDown");
- return super.onDown(e);
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onFling:velocityX = " + velocityX + " velocityY" + velocityY);
- return super.onFling(e1, e2, velocityX, velocityY);
- }
- @Override
- public void onLongPress(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onLongPress");
- super.onLongPress(e);
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onScroll:distanceX = " + distanceX + " distanceY = " + distanceY);
- return super.onScroll(e1, e2, distanceX, distanceY);
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onSingleTapUp");
- return super.onSingleTapUp(e);
- }
- }
- }
//以上部分内容选自网络
视屏播放界面的手势控制界面:
- package com.azhibo.zhibo.view;
- import java.util.HashMap;
- import java.util.Map;
- import io.vov.vitamio.LibsChecker;
- import io.vov.vitamio.MediaPlayer;
- import io.vov.vitamio.MediaPlayer.OnCompletionListener;
- import io.vov.vitamio.MediaPlayer.OnErrorListener;
- import io.vov.vitamio.MediaPlayer.OnPreparedListener;
- import io.vov.vitamio.widget.MediaController;
- import io.vov.vitamio.widget.VideoIntefaceClick;
- import io.vov.vitamio.widget.VideoUtils;
- import io.vov.vitamio.widget.VideoView;
- import android.app.Activity;
- import android.content.Context;
- import android.content.res.Configuration;
- import android.media.AudioManager;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.view.Display;
- import android.view.GestureDetector;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.Window;
- import android.view.WindowManager;
- import android.view.GestureDetector.SimpleOnGestureListener;
- import android.widget.ImageButton;
- import android.widget.ImageView;
- import android.widget.ProgressBar;
- import android.widget.Toast;
- import com.apple.down.assit.DownLoadInfo;
- import com.azhibo.zhibo.R;
- import com.umeng.analytics.MobclickAgent;
- public class VideoViewActivity extends Activity {
- private static int n=0;
- //private String path = "";
- private VideoView mVideoView;
- public VideoIntefaceClick listItemCall;
- private Uri pathUri;
- private ProgressBar probar;
- private String type=null;
- private int mLayout = VideoView.VIDEO_LAYOUT_SCALE;
- private View mVolumeBrightnessLayout;
- private ImageView mOperationBg;
- private ImageView mOperationPercent;
- private AudioManager mAudioManager;
- /** 最大声音 */
- private int mMaxVolume;
- /** 当前声音 */
- private int mVolume = -1;
- /** 当前亮度 */
- private float mBrightness = -1f;
- private GestureDetector mGestureDetector;
- private String path="";
- private String title="";
- private DownLoadInfo info=null;
- //xulongheng 播放界面的视频监听事件
- private class ListItemViewListener implements VideoIntefaceClick {
- @Override
- public void onExitVideo() {
- if(type!=null&&type.equals("1")){
- Toast.makeText(VideoViewActivity.this, "请耐心等待视频下载完毕!", Toast.LENGTH_SHORT).show();
- }else{
- Toast.makeText(VideoViewActivity.this, "本直播源需要休息一下,换一个试试吧!", Toast.LENGTH_SHORT).show();
- }
- Log.v("xulongheng*VideoViewActivity*onExitVideo:", "--->onExitVideo "+type);
- VideoViewActivity.this.finish();
- }
- @Override
- public void onCheckVagueVide(int statue, String url) {
- // TODO Auto-generated method stub
- Log.v("xulongheng*VideoViewActivity*onCheckVagueVide:", "--->onCheckVagueVide statue"+statue);
- Message msg=new Message();
- msg.obj=url;
- msg.what=statue;
- mHandler.sendMessage(msg);
- }
- }
- @Override
- public void onCreate(Bundle icicle) {
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- super.onCreate(icicle);
- if (!LibsChecker.checkVitamioLibs(this, getClass().getName(), R.string.init_decoders, R.raw.libarm))
- {
- return;
- }
- setContentView(R.layout.videoview);
- mVideoView = (VideoView) findViewById(R.id.surface_view);
- probar=(ProgressBar) findViewById(R.id.probar);
- mVolumeBrightnessLayout = findViewById(R.id.operation_volume_brightness);
- mOperationBg = (ImageView) findViewById(R.id.operation_bg);
- mOperationPercent = (ImageView) findViewById(R.id.operation_percent);
- mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- listItemCall = new ListItemViewListener();
- mVideoView.setVideoIntefaceClick(listItemCall);
- ImageButton showLeft=(ImageButton) findViewById(R.id.showLeft);
- path=this.getIntent().getStringExtra("url");
- title=getIntent().getStringExtra("title");
- // info=(DownLoadInfo) getIntent().getSerializableExtra("info");
- // path="http://218.26.231.201/youku/69722EE89093676C988636194/030020010052A91FBF7A9A036E0AF8E178E089-4698-FC9B-45D5-E65EA8462AF1.mp4";
- Log.v("xulongheng*VideoView*uri***", ":"+path);
- pathUri = Uri.parse(path);
- type=this.getIntent().getStringExtra("type");
- if(type!=null&&type.equals("1")){
- probar.setVisibility(View.GONE);
- StringBuilder builder=new StringBuilder();
- for(int i=0;i<path.split("/").length;i++){
- if(i!=0){
- builder.append(path.split("/")[i]);
- if(i!=path.split("/").length-1)
- builder.append("/");
- }
- }
- mVideoView.setVideoPath(builder.toString(),this,this.getString(R.string.app_name),this.getString(R.string.load_now));
- }else{
- VideoUtils videoUtls=new VideoUtils(this,pathUri);
- if(videoUtls.checkVagueVide()){
- Log.i("HU", "--->pathpath"+pathUri);
- videoUtls.setVideoIntefaceClick(listItemCall);
- videoUtls.doWith(pathUri.toString());
- }else{
- probar.setVisibility(View.GONE);
- mVideoView.setVideoURI(pathUri,this,this.getString(R.string.app_name),this.getString(R.string.load_now));
- }
- }
- mVideoView.start();
- //xlh_add 添加播放器监听
- initVideoListen();
- mGestureDetector = new GestureDetector(this, new MyGestureListener());
- }
- public void initVideoListen(){
- mVideoView.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);
- mVideoView.setOnPreparedListener(new OnPreparedListener() {
- @Override
- public void onPrepared(MediaPlayer mp) {
- mVideoView.setSubShown(true);
- Log.v("xulongheng*VideoActivity*播放器播放准备监听:", "onPrepared");
- }
- });
- mVideoView.setOnCompletionListener(new OnCompletionListener() {
- @Override
- public void onCompletion(MediaPlayer arg0) {
- n++;
- Toast.makeText(VideoViewActivity.this, "播放即将结束!", Toast.LENGTH_SHORT).show();
- VideoViewActivity.this.finish();
- Log.v("xulongheng*VideoActivity*播放器播放完成监听:", "onCompletion"+n);
- }
- });
- mVideoView.setOnErrorListener(new OnErrorListener() {
- @Override
- public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
- //播放源错误统计分析 未完成
- Map<String, String> source = new HashMap<String, String>();
- source.put("url", path);
- if(title!=null&&!title.equals(""))
- source.put("title", title);
- MobclickAgent.onEvent(VideoViewActivity.this, "ErrorSource",source);
- Toast.makeText(VideoViewActivity.this, "本视频无法播放", Toast.LENGTH_SHORT).show();
- VideoViewActivity.this.finish();
- Log.v("xulongheng*VideoActivity*播放器播放错误监听:", "onError:"+arg1+"/"+arg2);
- return false;
- }
- });
- mVideoView.setMediaController(new MediaController(this));
- }
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- if (mVideoView != null)
- {
- mVideoView.setVideoLayout(mLayout, 0);
- }
- super.onConfigurationChanged(newConfig);
- }
- public Handler mHandler = new Handler() {
- @SuppressWarnings("unchecked")
- public void handleMessage(Message msg) {
- probar.setVisibility(View.GONE);
- switch(msg.what){
- case 0:
- mVideoView.setVideoURI(Uri.parse(msg.obj.toString()),VideoViewActivity.this,VideoViewActivity.this.getString(R.string.app_name),VideoViewActivity.this.getString(R.string.load_now));
- break;
- case 1:
- mVideoView.setVideoURI(Uri.parse(msg.obj.toString()),VideoViewActivity.this,VideoViewActivity.this.getString(R.string.app_name),VideoViewActivity.this.getString(R.string.load_now));
- break;
- }
- }
- };
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (mGestureDetector.onTouchEvent(event))
- return true;
- // 处理手势结束 多点触控之MotionEvent.ACTION_MASK作用
- switch (event.getAction() & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_UP:
- endGesture();
- break;
- }
- return super.onTouchEvent(event);
- }
- /** 手势结束 */
- private void endGesture() {
- mVolume = -1;
- mBrightness = -1f;
- // 隐藏
- mDismissHandler.removeMessages(0);
- mDismissHandler.sendEmptyMessageDelayed(0, 500);
- }
- //xulongheng 触屏横向调音量
- private class MyGestureListener extends SimpleOnGestureListener {
- /** 双击 */
- @Override
- public boolean onDoubleTap(MotionEvent e) {
- if (mLayout == VideoView.VIDEO_LAYOUT_SCALE)
- mLayout = VideoView.VIDEO_LAYOUT_ZOOM;
- else
- mLayout = VideoView.VIDEO_LAYOUT_SCALE;
- Log.d("Scale = ", Integer.toString(mLayout));
- if (mVideoView != null)
- {
- mVideoView.setVideoLayout(mLayout, 0);
- }
- return true;
- }
- /** 左右两边滑动调节音量两度 */
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
- float mOldX = e1.getX(), mOldY = e1.getY();
- int y = (int) e2.getRawY();
- Display disp = getWindowManager().getDefaultDisplay();
- int windowWidth = disp.getWidth();
- int windowHeight = disp.getHeight();
- if (mOldX > windowWidth * 4.0 / 5)// 右边滑动
- onVolumeSlide((mOldY - y) / windowHeight);
- else if (mOldX < windowWidth / 5.0)// 左边滑动
- onBrightnessSlide((mOldY - y) / windowHeight);
- return super.onScroll(e1, e2, distanceX, distanceY);
- }
- }
- /** xulongheng定时隐藏 */
- private Handler mDismissHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- mVolumeBrightnessLayout.setVisibility(View.GONE);
- }
- };
- /**
- * 滑动改变声音大小
- *
- * @param percent
- */
- private void onVolumeSlide(float percent) {
- if (mVolume == -1) {
- mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
- if (mVolume < 0)
- mVolume = 0;
- // 显示
- mOperationBg.setImageResource(R.drawable.video_volumn_bg);
- mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
- }
- int index = (int) (percent * mMaxVolume) + mVolume;
- if (index > mMaxVolume)
- index = mMaxVolume;
- else if (index < 0)
- index = 0;
- // 变更声音
- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
- // 变更进度条
- ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
- lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;
- mOperationPercent.setLayoutParams(lp);
- }
- /**
- * xulongheng 滑动改变亮度
- *
- * @param percent
- */
- private void onBrightnessSlide(float percent) {
- if (mBrightness < 0) {
- mBrightness = getWindow().getAttributes().screenBrightness;
- if (mBrightness <= 0.00f)
- mBrightness = 0.50f;
- if (mBrightness < 0.01f)
- mBrightness = 0.01f;
- // 显示
- mOperationBg.setImageResource(R.drawable.video_brightness_bg);
- mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
- }
- WindowManager.LayoutParams lpa = getWindow().getAttributes();
- lpa.screenBrightness = mBrightness + percent;
- if (lpa.screenBrightness > 1.0f)
- lpa.screenBrightness = 1.0f;
- else if (lpa.screenBrightness < 0.01f)
- lpa.screenBrightness = 0.01f;
- getWindow().setAttributes(lpa);
- ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
- lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);
- mOperationPercent.setLayoutParams(lp);
- }
- }