packagecom.test.myvideo.SuoMudeio;importandroid.content.Context;importandroid.support.v4.widget.ViewDragHelper;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.view.ScaleGestureDetector;importandroid.view.View;importandroid.widget.FrameLayout;importcom.nineoldandroids.view.ViewHelper;/*** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* 0\ = /0* ___/`---'\___* .' \\| |// '.* / \\||| : |||// \* / _||||| -卍-|||||- \* | | \\\ - /// | |* | \_| ''\---/'' |_/ |* \ .-\__ '-' ___/-. /* ___'. .' /--.--\ `. .'___* ."" '< `.___\__/___.' >' "".* | | : `- \`.;`\ _ /`;.`/ - ` : | |* \ \ `_. \_ __\ /__ _/ .-` / /* =====`-.____`.___ \_____/___.-`___.-'=====* `=---='*佛祖保佑 永无BUG*佛曰:*程序园里程序天,程序天里程序员;*程序猿人写程序,又拿程序换肉钱。*肉饱继续桌前坐,饱暖还是桌前眠;*半迷半醒日复日,码上码下年复年。*但愿叱咤互联世,不愿搬砖码当前;*诸葛周瑜算世事,我来算出得加钱。*别人笑我忒直男,我笑自己太像猿;*但见成都府国内,处处地地程序员。* Created by水东流on 2018/2/26 0026.*/public classPowerFullLayoutextendsFrameLayout{

//屏幕宽高private intscreenHeight;private intscreenWidth;privateViewDragHelpermDragHelper;private longlastMultiTouchTime;//记录多点触控缩放后的时间private intoriginalWidth;// view宽度private intoriginalHeight;// view高度privateScaleGestureDetectormScaleGestureDetector= null;// private View view;private intdownX;//手指按下的x坐标值private intdownY;//手指按下的y坐标值private intleft;// view的左坐标值private inttop;// view的上坐标值private intright;// view的右坐标值private intbottom;// view的下坐标值private intnewHeight;private intnewWidth;public booleanisScale= false;private floatscale;private floatpreScale= 1;//默认前一次缩放比例为1publicPowerFullLayout(Contextcontext,AttributeSet attrs, intdefStyleAttr) {

super(context,attrs,defStyleAttr);init(context);}

publicPowerFullLayout(Contextcontext,AttributeSet attrs) {

this(context,attrs,0);}

publicPowerFullLayout(Contextcontext) {

this(context,null);}

private voidinit(Contextcontext) {

mDragHelper= ViewDragHelper.create(this,callback);mScaleGestureDetector= newScaleGestureDetector(context,newScaleGestureListener());}

@Overrideprotected voidonSizeChanged(intw, inth, intoldw, intoldh) {

super.onSizeChanged(w,h,oldw,oldh);screenWidth= getMeasuredWidth();screenHeight= getMeasuredHeight();}

@Overridepublic booleanonInterceptTouchEvent(MotionEventev) {

super.onInterceptTouchEvent(ev);returnisScale;}

private booleanneedToHandle=true;@Overridepublic booleanonTouchEvent(MotionEventevent) {

intpointerCount = event.getPointerCount();//获得多少点if(pointerCount > 1) {//多点触控,switch(event.getAction()) {

caseMotionEvent.ACTION_DOWN:

needToHandle=true;break;caseMotionEvent.ACTION_MOVE:

break;caseMotionEvent.ACTION_POINTER_2_UP://第二个手指抬起的时候needToHandle=true;break;default:

break;}

returnmScaleGestureDetector.onTouchEvent(event);//让mScaleGestureDetector处理触摸事件} else{

longcurrentTimeMillis = System.currentTimeMillis();if(currentTimeMillis - lastMultiTouchTime> 200&&needToHandle) {

//多点触控全部手指抬起后要等待200毫秒才能执行单指触控的操作,避免多点触控后出现颤抖的情况try{

mDragHelper.processTouchEvent(event);} catch(Exceptione) {

e.printStackTrace();}

return true;}

// }}

return false;}

privateViewDragHelper.Callbackcallback= newViewDragHelper.Callback() {

/***用于判断是否捕获当前child的触摸事件**@paramchild*当前触摸的子view*@parampointerId*@returntrue就捕获并解析;false不捕获*/@Overridepublic booleantryCaptureView(Viewchild, intpointerId) {

if(preScale> 1){

return true;}

return false;}

/***控制水平方向上的位置*/@Overridepublic intclampViewPositionHorizontal(Viewchild, intleft, intdx) {

if(left < (screenWidth- screenWidth* preScale) / 2)

left = (int) (screenWidth- screenWidth* preScale) / 2;//限制mainView可向左移动到的位置if(left > (screenWidth* preScale- screenWidth) / 2)

left = (int) (screenWidth* preScale- screenWidth) / 2;//限制mainView可向右移动到的位置returnleft;}

public intclampViewPositionVertical(Viewchild, inttop, intdy) {

if(top < (screenHeight- screenHeight* preScale) / 2) {

top = (int) (screenHeight- screenHeight* preScale) / 2;//限制mainView可向上移动到的位置}

if(top > (screenHeight* preScale- screenHeight) / 2) {

top = (int) (screenHeight* preScale- screenHeight) / 2;//限制mainView可向上移动到的位置}

returntop;}

};public classScaleGestureListenerimplementsScaleGestureDetector.OnScaleGestureListener {

@Overridepublic booleanonScale(ScaleGestureDetectordetector) {

floatpreviousSpan = detector.getPreviousSpan();//前一次双指间距floatcurrentSpan = detector.getCurrentSpan();//本次双指间距if(currentSpan < previousSpan) {

//缩小scale= preScale- (previousSpan - currentSpan) / 1000;} else{

//放大scale= preScale+ (currentSpan - previousSpan) / 1000;}

//缩放viewif(scale> 0.5) {

ViewHelper.setScaleX(PowerFullLayout.this,scale);// x方向上缩放ViewHelper.setScaleY(PowerFullLayout.this,scale);// y方向上缩放}

return false;}

@Overridepublic booleanonScaleBegin(ScaleGestureDetectordetector) {

//一定要返回true才会进入onScale()这个函数return true;}

@Overridepublic voidonScaleEnd(ScaleGestureDetectordetector) {

preScale= scale;//记录本次缩放比例lastMultiTouchTime= System.currentTimeMillis();//记录双指缩放后的时间}

}

}

xml中的实际情况

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐