Android重温--触屏事件
今天没事的时候看了看自己以前学习Android的视频,第一眼看到视频感觉标题很简单,但是不去百度不看博客查阅相关知识,感觉有点忘记了好多基础的东西,正所谓是“基础不牢,地动山摇”。
今天我要说一个小的事情,也是今天的博客的主题---触屏事件!
大家都玩手机的时候点击屏幕,点击屏幕的事件就是触屏事件,点击屏幕就会响应相应的动作和功能的实现。下面我们一起学习一下---触屏事件。
一、首先介绍一下触屏事件的相关知识
1.触屏事件应用到的重写OnTouchEvent()方法,用于自身调用,并在该方法中实现相应的动作。
2.触屏事件中的 getAction()得到触屏的动作类型,然后与MotionEvent中的动作类型进行比对。
3.MotionEvent的最主要的两个动作:ACTION_DOWN和ACTION_UP两个动作。
4.触屏事件获得相应的位置。event.getX()和event.getY()两个方法,注意得到的是float数据类型,还有得到的数据是以像素为单位的。
5.类似游戏中拖拽着飞机移动的效果实现,用到了触屏事件。
二、触屏事件相关博客的知识整理
1.android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
2.
三、当发生触屏事件系统的响应
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件.
四、对于移动的触屏事件我写了个代码。
1.首先我自定义了个MyView继承View。
代码中用到自定义View的知识,大家如果忘记的话可以看看大神的博客
自定义View(一) http://blog.csdn.net/lmj623565791/article/details/24252901
自定义View(二)进阶 http://blog.csdn.net/lmj623565791/article/details/24300125
自定义View (三) 圆环交替 等待效果 http://blog.csdn.net/lmj623565791/article/details/24500107
很不错的博客,大家可以学一学。
下面我就继续讲解我的代码,在代码中将onDraw()方法重写,然后进行简单的代码实现:
import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.View;import com.zes.base.mydalytext.R;public class MyView extends View { private Bitmap bitmap = null; public int xx; public int yy ; public void setXx(int xx) { this.xx = xx; } public void setYy(int yy) { this.yy = yy; } public MyView(Context context, AttributeSet attrs) { super(context, attrs); bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.map_pin); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bitmap,xx-bitmap.getWidth()/2,yy-bitmap.getHeight()/2,null); }}
2.自定义了View之后添加到Activity的xml中去。代码如下:
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.zes.base.mydalytext.MainActivity"> android:id="@+id/myview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" />
3.下面是主代码的实现:
import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.MotionEvent;import android.view.Window;import android.view.WindowManager;import android.widget.Toast;import com.zes.base.mydalytext.view.MyView;public class MainActivity extends Activity { private MyView myview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); myview=(MyView) findViewById(R.id.myview); } @Override public boolean onTouchEvent(MotionEvent event) { myview.setXx((int)event.getX()); myview.setYy((int)event.getY()); Log.i("TEXT","x---------"+event.getX()+"-------y-------"+event.getY()); myview.invalidate(); return super.onTouchEvent(event); }
实现后就可以点击屏幕上的图片控件进行移动。很简单的操作,但是让人想起很多小知识点。并可以从中学到大神的博客知识。谢谢大家!
更多相关文章
- android显示RGB565数据图像
- Android-几行代码通知系统自动安装apk
- Android上对非标准RSS进行解析之后的反思
- Android(安卓)ProgressBar详解以及自定义
- 实现Android监控任意控件或按键双击事件方法
- Android(安卓)Studio编译C++代码——Release与Debug版本的记录
- Android工程中R类访问不到工程中的资源文件的解决方法
- 我的安卓应用——SchoolSystem的代码展示
- Android(安卓)不得不说的VideoView的一些坑及其解决方案