• 关于手势识别是Android为了方便开发人员处理屏幕上的触摸、拖动、单双击、滑动等提供的一组接口。用这个我们可以很方便的在屏幕上做出想要的效果,比如滑动翻页、触摸不同区域采用不同处理等。 在日常生活中,我们...

    手势识别GestureDetector

    关于手势识别是Android为了方便开发人员处理屏幕上的触摸、拖动、单双击、滑动等提供的一组接口。用这个我们可以很方便的在屏幕上做出想要的效果,比如滑动翻页、触摸不同区域采用不同处理等。

    在日常生活中,我们常用的手机浏览器等,都有这样的应用。比如,当你用手机浏览器看小说时,点击屏幕下方,会翻到下一页;点击屏幕上方,会翻到上一页;当你点击屏幕中央时,出现目录选择等;

    现在就看下如何实现以上我们提到的效果。

    手势识别涉及的接口或者类

    手势识别涉及的接口有:OnGestureListener、OnDoubleTapListener;涉及的类有:SimpleOnGestureListener。

    OnGestureListener接口

    这里我们新建一个类,来实现该接口。类中实现所有方法,代码如下:

    package com.example.androiddetector_csdn;
    
    import android.content.Context;
    import android.util.Log;
    import android.view.GestureDetector.OnGestureListener;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.TextView;
    
    public class GuestureImp implements OnGestureListener{
    
    	Context context;
    	View view;
    	String tag="me";
    	
    	
    	public GuestureImp(Context ct,View vw) {
    		// TODO Auto-generated constructor stub
    		context=ct;
    		view=vw;
    	}
    
    	@Override
    	public boolean onDown(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "down-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    		
    		return true;
    	}
    
    	@Override
    	public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
    			float arg3) {
    		// TODO Auto-generated method stub
    		
    		return true;
    	}
    
    	@Override
    	public void onLongPress(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onLongPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    	}
    
    	@Override
    	public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
    			float arg3) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onScroll-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    		return false;
    	}
    
    	@Override
    	public void onShowPress(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onShowPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    	}
    
    	@Override
    	public boolean onSingleTapUp(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onSingleTapUp-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    		return false;
    	}
    
    }
    
    这里的方法解释,引用网上的解释如下:

    按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
    抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
    长按(onLongPress): 手指按在持续一段时间,并且没有松开。
    滚动(onScroll): 手指在触摸屏上滑动。
    按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
    抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
    看解释就能理解我们可以用这个接口,做哪些操作。如果你要做滑动的控制,那么,你可以把代码写到onFling中,如果你要做拖动的操作,代码写到onScroll中。

    一般情况下,运行顺序有以下几种:

    onDown-onSingleTapUp;

    onDown-onShowPress-onLongPress;

    网上也有总结一个规律:

    任何手势动作都会先执行一次按下(onDown)动作。
    长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
    按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
    长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。
    
    在这里有个要注意的地方,就是onDown的返回值,如果你设为false,经测试,它就一直只执行onDown-onShowPress-onLongPress;其他的并不会执行。

    如果设为true,则正常。

    OnDoubleTapListener接口

    这个接口主要是用于处理屏幕双击以及单击的。(其实,如果单单处理单击,用OnGestureListener接口就已足够,这里主要还是做双击的处理)
    同样的新建一个类,实现该接口。如下:
    package com.example.androiddetector_csdn;
    
    import android.util.Log;
    import android.view.GestureDetector.OnDoubleTapListener;
    import android.view.MotionEvent;
    
    public class DoubleTabImp implements OnDoubleTapListener{
    
    	String tag="me";
    	public DoubleTabImp() {
    		// TODO Auto-generated constructor stub
    	}
    
    	@Override
    	public boolean onSingleTapConfirmed(MotionEvent paramMotionEvent) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onSingleTapConfirmed");
    		return false;
    	}
    
    	@Override
    	public boolean onDoubleTap(MotionEvent paramMotionEvent) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onDoubleTap");
    		return false;
    	}
    
    	@Override
    	public boolean onDoubleTapEvent(MotionEvent paramMotionEvent) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onDoubleTapEvent");
    		return false;
    	}
    
    }
    
    这个方法的实现,需要首先实现了OnGestureListener才能进行。
    我们用写log的形式,来看它们的执行顺序。
    12-04 15:00:34.434: E/me(25274): down
    12-04 15:00:34.524: E/me(25274): onSingleTapUp
    12-04 15:00:34.614: E/me(25274): onDoubleTap
    12-04 15:00:34.614: E/me(25274): onDoubleTapEvent
    12-04 15:00:34.624: E/me(25274): down
    12-04 15:00:34.684: E/me(25274): onDoubleTapEvent
    如果是单击,顺序如下:
    12-04 15:15:33.664: E/me(25274): down
    12-04 15:15:33.764: E/me(25274): onSingleTapUp
    12-04 15:15:33.964: E/me(25274): onSingleTapConfirmed

    SimpleOnGestureListener类

    这个类,实际上是实现了以上两个接口的一个类。使用的时候,可以继承这个类,选择你要的方法来实现相应的操作。
    也就是说,你可以直接用这个,不用上面的两个接口。
    例如:
    package com.example.androiddetector_csdn;
    
    import android.view.GestureDetector.SimpleOnGestureListener;
    import android.view.MotionEvent;
    
    public class SimpleGuestureImp extends SimpleOnGestureListener{
    
    	public SimpleGuestureImp() {
    		// TODO Auto-generated constructor stub
    	}
    
    	@Override
    	public boolean onSingleTapUp(MotionEvent e) {
    		// TODO Auto-generated method stub
    		return super.onSingleTapUp(e);
    	}
    
    	@Override
    	public void onLongPress(MotionEvent e) {
    		// TODO Auto-generated method stub
    		super.onLongPress(e);
    	}
    
    	@Override
    	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
    			float distanceY) {
    		// TODO Auto-generated method stub
    		return super.onScroll(e1, e2, distanceX, distanceY);
    	}
    
    	@Override
    	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    			float velocityY) {
    		// TODO Auto-generated method stub
    		return super.onFling(e1, e2, velocityX, velocityY);
    	}
    
    	@Override
    	public void onShowPress(MotionEvent e) {
    		// TODO Auto-generated method stub
    		super.onShowPress(e);
    	}
    
    	@Override
    	public boolean onDown(MotionEvent e) {
    		// TODO Auto-generated method stub
    		return super.onDown(e);
    	}
    
    	@Override
    	public boolean onDoubleTap(MotionEvent e) {
    		// TODO Auto-generated method stub
    		return super.onDoubleTap(e);
    	}
    
    	@Override
    	public boolean onDoubleTapEvent(MotionEvent e) {
    		// TODO Auto-generated method stub
    		return super.onDoubleTapEvent(e);
    	}
    
    	@Override
    	public boolean onSingleTapConfirmed(MotionEvent e) {
    		// TODO Auto-generated method stub
    		return super.onSingleTapConfirmed(e);
    	}
    
    	
    }
    
    这里很齐全,什么都不缺了。

    手势识别——滑动的使用

    这里我们开始用例子来说明如何实现滑动效果,步骤如下:
    1、新建工程,在新的工程中有默认的MainActivity,这个类要实现接口OnTouchListener;
    2、定义接口GestureDetector mGestureDetector,并将接口实现传入;  
    3、绑定view与ontouchlistener;
    3、截取OnTouchListener的event,将它传入gesturedetector中。
    如果我们要将OnDoubleTapListener的接口实现也放入,那么用mGestureDetector.setOnDoubleTapListener(new DoubleTabImp());绑定这个实现。
    如下:
    package com.example.androiddetector_csdn;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    public class MainActivity extends Activity implements OnTouchListener {
    
    	 GestureDetector mGestureDetector;  
    	@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            TextView textView=(TextView)findViewById(R.id.mytext);
            GuestureImp imp=new GuestureImp(MainActivity.this,textView);
            mGestureDetector=new GestureDetector(MainActivity.this, imp);
            mGestureDetector.setOnDoubleTapListener(new DoubleTabImp());
            
            textView.setOnTouchListener(this);
        }
    
    	@Override
    	public boolean onTouch(View arg0, MotionEvent arg1) {
    		// TODO Auto-generated method stub
    	  boolean temp=	mGestureDetector.onTouchEvent(arg1);
    		return temp;
    	}
    }
    
    另外,重点在于,在OnGestureListener接口的实现中,写入以下代码:
    @Override
    	public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
    			float arg3) {
    		// TODO Auto-generated method stub
    		int mini_width=120;
    		int mini_speed=0;
    		float distance_right=arg1.getX()-arg0.getX();
    		float distance_left=arg0.getX()-arg1.getX();
    		float distance_down=arg1.getY()-arg0.getY();
    		float distance_up=arg0.getY()-arg1.getY();
    		if(distance_right>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向右滑动");
    		}
    		else if(distance_left>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向左滑动");
    		}
    		else if(distance_down>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向下滑动");
    		}
    		else if(distance_up>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向上滑动");
    		}
    		return true;
    	}
    第一个参数MotionEvent,是指首次触摸屏幕时的状态;第二个参数MotionEvent是最后一次触摸屏幕时的状态;第三个参数,是在X轴上滑动的速度,单位是像素/s;第四个参数,是在Y轴上滑动的速度,单位是像素/s。
    解释了以上参数,就能看懂代码意思,主要就是对比X或者Y方向的滑动距离,滑动距离超过120并且速度大于0的时候,会做出滑动提示。这里你可以把提示换成你想要实现的方法。


    以上就是,我们在view上滑动操作的实现;

    屏幕上分区域点击实现不同操作

    这个其实与手势识别没有什么关系了。
    先看一张图:

    假设这是一个屏幕,那么我们如果想在点击屏幕不同区域,实现不同的效果,比如翻页。那么我们需要做哪些定义和操作呢?
    操作步骤如下:
    1、获取整个屏幕的长宽;
    2、获取中心点的坐标(可以根据长宽来计算,也可以根据API获取);
    3、制定规则,我们制定的规则是与中心坐标距离不超过1/4的,都算是中心区域;
    4、其他的在各个角落的分别定义;
    代码实现如下:
    package com.example.androiddetector_csdn;
    
    import android.content.Context;
    import android.graphics.Point;
    import android.util.Log;
    import android.view.View;
    import android.view.WindowManager;
    
    public class MatchXY {
    
    	String tag="me";
    	Context context;
    	View view;
    	public MatchXY(Context ct,View vw) {
    		// TODO Auto-generated constructor stub
    		context=ct;
    		view=vw;
    	}
    
    	public ResultStatus GetWhereAreYou(float x,float y)
    	{
    		WindowManager wm =(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    		//过时的方法
    		 int width = wm.getDefaultDisplay().getWidth();
    		 int height = wm.getDefaultDisplay().getHeight();
    		 Log.e(tag, "deprecated--width:"+width+" height:"+height);
    		//level 13以上可用的方法
    		 Point point=new Point();
    		 wm.getDefaultDisplay().getSize(point);
    		 int width_here=point.x;
    		 int height_here=point.y;
    		 Log.e(tag, "now--width:"+width_here+" height:"+height_here);
    		 
    		//取屏幕中心点的坐标
    		 int center_x=width_here/2;
    		 int center_y=height_here/2;
    		 Log.e(tag, "center_x:"+center_x+" center_y:"+center_y);
    		 
    		 
    		 //以与中心四分之一距离作为临界点
    		 int min_center_x=center_x-center_x/4;
    		 int max_center_x=center_x+center_x/4;
    		 int min_center_y=center_y-center_y/4;
    		 int max_center_y=center_y+center_y/4;
    		 
    		 //根据以上的范围,将之连接起来,是一个四方的围,在这个范围内的touch,定义为中心点击
    		 if((x>min_center_x&&x<max_center_x)&&(y>min_center_y&&y<max_center_y))
    		 {
    			 //在围内
    			 Log.e(tag, "中间区域:x:"+x+" y:"+y);
    			 return ResultStatus.CENTER;
    		 }
    		 else if(x<center_x&&y<center_y)
    		 {
    			 //不在围内
    			 Log.e(tag, "左上区域:x:"+x+" y:"+y);
    			 return ResultStatus.UP;
    		}
    		 else if (x>center_x&&y<center_y) {
    			//不在围内
    			 Log.e(tag, "右上区域:x:"+x+" y:"+y);
    			 return ResultStatus.UP;
    		}
    		 else if (x>center_x&&y>center_y) {
    			//不在围内
    			 Log.e(tag, "右下区域:x:"+x+" y:"+y);
    			 return ResultStatus.DOWN;
    		}
    		 else if (x<center_x&&y>center_y) {
    			//不在围内
    			 Log.e(tag, "左下区域:x:"+x+" y:"+y);
    			 return ResultStatus.DOWN;
    		}
    		 else {
    			 Log.e(tag, "未知区域:x:"+x+" y:"+y);
    			 return null;
    		}
    	}
    }
    
    根据以上的代码我们可以实现点击不同的区域做不同的操作。这样在接口的实现中加入一些代码,看效果:
    package com.example.androiddetector_csdn;
    
    import android.content.Context;
    import android.util.Log;
    import android.view.GestureDetector.OnGestureListener;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.TextView;
    
    public class GuestureImp implements OnGestureListener{
    
    	Context context;
    	View view;
    	String tag="me";
    	
    	String firstString="秦霸先,他是英雄的典范,武当派出身,早早习练“纯阳功”。文武双全,年轻时又名秦策,道号元冲,此人文武全才,当世英豪。二十四岁因一女子反出武当,自赴西北,后练成天山武学,自称天下无敌。二十六岁中状元,改名霸先。   因身为状元却又武艺渊深(“只手便举起殿前石狮子,纵跃飞奔如常”),初时在朝中无亲无故。后受到武英帝赏识,与柳昂天平定也先有功,爵赐武德侯,官拜征西大都督,与柳昂天并称“西霸先、北昂天”。武英十五年,武英帝御驾亲征失败,他将武英帝藏入神机洞中,反遭奸人陷害,一家老小几灭满门,被迫率三万将士造反,创立怒苍山,立忠义堂,聚天下群豪,与景泰朝廷大战十四年,后接受招安,惨死神鬼亭。传下“戊辰岁终,龙皇动世,天机犹真,神鬼自在”四句偈语,与一张羊皮一起被称为关系天下气运。";
    	String secondString="卢云,山东潍县人,自幼父母双亡,苦读自学,学得一身经世致用的好学问,却不幸屡试不第,沦落到靠做酒肆店伙为生。在做酒肆店伙时为当地地痞陷害,又被贪官诬指为杀人犯,旦夕将死,适逢怒苍山残党(太湖双龙寨)劫狱救人,才得以脱困而出。逃狱之后,卢云以拉纤为业,顺运河而下直至扬州,在扬州入景泰朝大臣顾嗣源家为僮仆,后于一偶然机会(对联)为顾所赏识,被网罗为顾府幕僚,嗣源独生女顾倩兮亦对卢云深有好感。同时,卢云并获得了武当派的练气之法,以及怒苍山残党陆孤瞻的拳法传授,结合两者,在武艺上自创无绝心法,后遂成武林心体气术势五大宗中(练)气一派的大师。";
    	String thirdString="杨肃观,杨远之子,面目俊俏,玉树临风,心机深沉,贵气逼人,潜龙的养子或亲生子,少林天绝传人,英雄志中身世最神秘的人。心地像神佛一样柔软的人,却承担了太多人的期望,以至于肩负了整个天下。作为替罪羔羊,历经猜疑磨难,已经心碎,终于当断则断,杀出重围,建立“镇国铁卫”,一举缔造佛国。身负“天诀”,手握“神剑”,驭“六道轮回”,一生费尽机心,以铁血平天下,自比修罗王,由佛入魔。其才天下无匹,其机心,直逼潜龙,其胸怀野心,更始吞吐天下。但是也因此毁情灭欲,罪恶滔天。佛说,我不如地狱,谁入地狱。杨肃观以一人入魔求天下太平,虽然灭绝人性,但仍不失为上上人物。";
    	public GuestureImp(Context ct,View vw) {
    		// TODO Auto-generated constructor stub
    		context=ct;
    		view=vw;
    	}
    
    	@Override
    	public boolean onDown(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "down-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    		MatchXY matchXY=new MatchXY(context,view);
    		 ResultStatus resultStatus= matchXY.GetWhereAreYou(arg0.getX(),arg0.getY());
    		 if(resultStatus.equals(ResultStatus.UP))
    		 {
    			 ((TextView)view).setText(firstString);
    		 }
    		 else  if(resultStatus.equals(ResultStatus.DOWN)){
    			 ((TextView)view).setText(secondString);
    		}
    		 else  if(resultStatus.equals(ResultStatus.CENTER)){
    			 ((TextView)view).setText(thirdString);
    		}
    		
    		return true;
    	}
    
    	@Override
    	public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
    			float arg3) {
    		// TODO Auto-generated method stub
    		int mini_width=120;
    		int mini_speed=0;
    		float distance_right=arg1.getX()-arg0.getX();
    		float distance_left=arg0.getX()-arg1.getX();
    		float distance_down=arg1.getY()-arg0.getY();
    		float distance_up=arg0.getY()-arg1.getY();
    		if(distance_right>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向右滑动");
    		}
    		else if(distance_left>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向左滑动");
    		}
    		else if(distance_down>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向下滑动");
    		}
    		else if(distance_up>mini_width && Math.abs(arg2)>mini_speed)
    		{
    			Log.e(tag, "onFling-"+"向上滑动");
    		}
    		return true;
    	}
    
    	@Override
    	public void onLongPress(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onLongPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    	}
    
    	@Override
    	public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
    			float arg3) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onScroll-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    		return false;
    	}
    
    	@Override
    	public void onShowPress(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onShowPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    	}
    
    	@Override
    	public boolean onSingleTapUp(MotionEvent arg0) {
    		// TODO Auto-generated method stub
    		Log.e(tag, "onSingleTapUp-"+"x:"+arg0.getX()+"y:"+arg0.getY());
    		return false;
    	}
    
    }
    

    效果如下:



    点击不同区域,textview中内容发生变化,简易版本翻译实现。

    源码

    源码位于:http://download.csdn.net/detail/yangzhaomuma/9326441


    展开全文
  • 使用以下代码中的值如何获取屏幕的宽和高: @Override protected void onMeasure(int widthSpecId, int heightSpecId) { Log.e(TAG, "onMeasure" + widthSpecId); setMeasuredDimension(SCREEN_WIDTH, ...
  • int[] location = new int[2] ; view.getLocationInWindow(location); //获取在当前窗口内的绝对...//获取在整个屏幕内的绝对坐标 location [0]--->x坐标,location [1]--->y坐标 也可以利用控件的getX(),getY()
  • Android屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因、重要概念、解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的...
  • 首先看一张图  其中,触摸点表示点击... View获取坐标的方法有:  getTop:获取到的,是view自身的顶边到其父布局顶边的距离  getLeft:获取到的,是view自身的左边到其父布局左边的距离 ... getRight:获取到...
  • 安卓手机屏幕亮度获取 2019-12-10 16:01:53
    按照网上的好多方法,获取当前屏幕亮度,但是这个数值已经远远超过了255.测试手机是红米k20pro,亮度调到最高后,用此方法获取到的数值是2047左右。 我需要用一个滑动条来控制亮度,但是这个最高亮度和之前看到的说...
  • 获取屏幕参数代码: Java代码  DisplayMetrics metric = new DisplayMetrics();  //API 17之后使用,获取的像素宽高包含虚拟键所占空间,在API 17之前通过反射获取  context.getWindowManag
  • 正常的判断屏幕方向的代码: ... /** 获取屏幕是否是竖屏 * @return */ @SuppressLint("SwitchIntDef") public boolean isScreenPortrait(){ int or = getRequestedOrientation(); switch (or) { ...
  • 获取左右滑动事件,如果滑动的距离超过屏幕宽度的1/3,就返回该滑动事件给activity或者fragment
  • 一:获取百度地图在手机上的经纬度(左上 右下 左下 右上) 1获取手机的宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); 2:左上 //左上 Point ...
  • Android 手机屏幕分辨率 2018-03-07 21:05:59
    屏幕尺寸屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米(下面有图文介绍)比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等屏幕分辨率屏幕分辨率是指在横纵向上的像素点数,单位是px,1...
  • 一、Android提供的两种手势: ①Android提供了手势检测,并为手势提供了相应的监听器 ②Android允许开发者添加手势,并提供了相应的API识别用户手势二、手势检测:手势检测器类:GestureDetector 监听器:...
  • 在做相机开发时,遇到一个问题,就是需要监听屏幕旋转。最简单的就是使用onConfigurationChanged()和OrientationEventListener这两种方法来实现,但是最后都遇到了问题。 #1 一开始是使用onConfigurationChanged...
  • android 获取view的位置坐标 2017-01-13 18:17:49
    我们重点在获取view的y坐标,你懂的... 依次介绍以下四个方法:   (1).getLocationInWindow   Java代码  int[] position = new int[2];  textview.getLocationInWindow(position...
  • Android屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因、重要概念、解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的...
  • Android获取View的宽高与View.measure详解
  • 前两篇文章已经把如何控制android设备的输入讲了,这一篇就是如何获取屏幕输出和对屏幕数据进行处理
  • 直接上代码备份:
  • 以下不是一个完整的演示,只是一些实现流程和思路 比如要获取中间小框框的...1,获取整个屏幕宽度的方法 // get Size DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefau...
1 2 3 4 5 ... 20
收藏数 18,279
精华内容 7,311