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中的实际情况