实现通过上滑或者下滑来切换前后摄像头的功能

本文介绍了一种在Android相机应用中实现手势滑动监听器的方法。通过定义GestureScrollListener接口,实现上滑、下滑等手势操作,并在PickerManager类中创建具体的监听器实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/GestureDispatcher.java中定义一个实现上滑下滑动作的监听接口
    public interface GestureScrollListener{
        	public boolean onDown(float x,float y, int width, int height);
        	public boolean onScroll(float dx,float dy,float totalX,float totalY);
        	public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY);
        	public boolean onUp();
        	public boolean onScale(float focusX,float focusY,float scale);
        	public boolean onScaleBegin(float focusX,float focusY);
        }

  • 并在该类中实例化一个GestureScrollListener接口,同时定义一个设置手势滑动的监听器方法
    private GestureScrollListener mGestureScrollListener;
        public void setGestureScrollListener(GestureScrollListener listener){
        	mGestureScrollListener=listener;
        }

  • 在该类重写的方法onScroll中添加
    if(mGestureScrollListener!=null&&mGestureScrollListener.onScroll(dx,dy,totalX,totalY)){
        	return false;
        }

  • 在该类重写的方法onFling中添加
    if(mGestureScrollListener!=null&&mGestureScrollListener.onFling(e1,e2,velocityX,velocityY)){
        	return false;
        }

  • 在该类重写的方法onScaleBegin中添加
    if(mGestureScrollListener!=null&&mGestureScrollListener.onScaleBegin(focusX,focusY)){
        	return false;
        }

  • 在该类重写的方法onScale中添加
    if(mGestureScrollListener!=null&&mGestureScrollListener.onScale(focusX,focusY,scale)){
        	return false;
        }

  • 在该类重写的方法onDown中添加
    if(mGestureScrollListener!=null&&mGestureScrollListener.onDown(vertex[0],vertex[1],(int)vertex[2],(int)vertex[3])){
        	return;
        }

  • 在该类重写的方法onUp中添加
    if(mGestureScrollListener!=null&&mGestureScrollListener.onUp()){
        	return;
        }

  • 在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/manager/PickerManager.java中定义一个继承了GestureScrollListener的类MyGestureScrollListener,添加内容如下:
    public class MyGestureScrollListener implements GestureScrollListener{
        	private boolean isScroll=false;
        	private boolean isScaled=false;
        	private float mTotalX=0;
        	private float mTotalY=0;
        	private long beginTouchTime=0;
        	private long endTouchTime=0;
        	private void CameraActivity mCameraActivity;
        	public void setCameraActivity(CameraActivity mCameraActivity){
        		this.mCameraActivity=mCameraActivity;
        	}
        	@Override
        	public bollean onScroll(float dx,float dy,float totalX,float totalY){
        		Log.i(TAG,"onScroll("+dx+","+dy+","+totalX+","+totalY+")");
        		if(!isScroll){
        			isScroll=true;
        		}
        		mTotalX=totalX;
        		mTotalY=totalY;
        		return false;
        	}
        	
        	@Override
        	public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY){
        		Log.i(TAG,"[onFling] ("+velocityX+", "+velocityY+")");
        		Log.d(TAG,"isScroll="+Boolean.toString(isScroll));
        		Log.d(TAG,"isScaled="+Boolean.toString(isScaled));
        		Log.d(TAG,"mCameraActivity.getCurrentMode()="+mCameraActivity.getCurrentMode());
        		if(!isScaled && isScroll && (mCameraActivity.getCurrentMode()!=ModePicker.MODE_VIDEO)){
        			endTouchTime=System.currentTimeMillis();
        			float time=Long.valueOf(endTouchTime-beginTouchTime).floatValue();
        			Log.d(TAG,"time ="+time+" mTotalX"+mTotalX+" mTotalY"+mTotalY+" beginTouchTime="+beginTouchTime);
        		if((Math.ads(mTotalY)>Math.abs(mTotalX))&&(Math.abs(mTotalY)>50)&&((Math.abs(mTotalY)/time)>((float)500/1000))){
        			Log.d(TAG,"Check over");
        			if(mCameraPicker!=null){
        				mCameraPicker.onClick(null);
        			}
        			else{
        				Log.d(TAG,"mCameraPicker=null");
        			}
        		}
        		return false;
        	}
        		
        	@Override
        	public boolean onScaleBegin(float focusX,float focusY){
        		Log.i(TAG,"onScaleBegin("+focusX+","+focusY+")");
        		isScaled=true;
        		return false;
        	}
        	
        	@Override
        	public boolean onScale(float focusX,float focusY,float scale){
        		Log.i(TAG,"onScale("+focusX+", "+focusY+", "+scale);
        		return false;
        	}
        	
        	@Override
        	public boolean onDown(float x,float y,int width,int height){
        		beginTouchTime=System.currentTimeMillis();
        		Log.i(TAG,"onDown()");
        		return false;
        	}
        	
        	@Override
        	public boolean onUp(){
        		Log.i(TAG,"onUp");
        		beginTouchTime=0;
        		endTouchTime=0;
        		isScaled=false;
        		isScroll=false;
        		return false;
        	}
        }
        

  • 在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/CameraActivity.java中添加GestureScrollListener对象和设置手势滑动监听器的方法
    private GestureScrollListener mGestureScrollListener;
        public void setGestureScrollListener(GestureScrollListener listener){
        	mGestureScrollListener=listener;
        }

  • 调用GestureDispatcher的设置监听器的方法
    mGestureDispatcher.setGestureScrollListener(mGestureScrollListener);

  • 在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/bridge/CameraAppUiImpl.java中定义一个MyGestureScrollListener对象,并将活动传入该监听器对象,同时给活动传入该监听器
    MyGestureScrollListener mGestureScrollListener=mPickerManage.new MyGestureScrollLisener();
        mGestureScrollListener.setCameraActivity(mCameraActivity);
        mCameraActivity.setGestureScrollListener(mGestureScrollListener);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值