android两种事件,【Android程序开发】Android事件处理的两种方式

心声

今天在写滑动解锁demo中提前学习了事件处理的方式,主要是学习回调处理事件。有些东西比较容易搞混,比如屏幕大小和容器大小,哪个方法是以容器为坐标系,哪些又是以屏幕为坐标系,虽然容易弄混,但并不难,只要理解了,也是很容易看懂的。

Android事件处理的两种方式

1.监听处理事件

2.回调处理事件

1.监听处理事件

参与者:

1.事件源:事件在哪发生(比如按钮被点了,那么事件源就是一个按钮)

2.监听者:谁来处理事件

3.事件: 到底是什么事件(点击,长按,旋转)

监听处理事件的过程

以事件源为按钮为例:

当用户做出点击按钮的行为,按钮就是所谓的事件源,监听者需要注册通知自己要监听的行为,然后获取事件(如:点击按钮就是一个事件),并处理按钮。而我们操作者所需要做的就是设置控件和监听者

c152138915ef

image.png

2.回调处理事件

监听处理事件的过程

首先有一个事件源->用户的某一个行为触发事件源->事件源自己处理事件->将事件处理之后的结果通过接口回调->处理回调事件(重写回调方法)

c152138915ef

image.png

处理一个touch事件,实现手在屏幕上滑动,控件跟着走或实现改变控件的颜色

xml文件里面,添加一个控件

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity"

android:id="@+id/root">

android:layout_width="100dp"

android:layout_height="100dp"

android:background="@color/colorAccent"

android:id="@+id/view"

android:tag="1"/>

步骤解析:

c152138915ef

c152138915ef

image.png

运行效果:

c152138915ef

image.png

MainActivity中

前提须知

1.getX()与getRawx()、getY()与getRawY()的区别

当你触到按钮时,x,y是相对于该按钮左上点(控件本身)的相对位置。

而Rawx,Rawy始终是相对于屏幕的位置。

c152138915ef

image.png

2.setX()、setY()用来改变控件的位置

实现手在屏幕上滑动,控件跟着走

public class MainActivity extends AppCompatActivity {

View redView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//通过id找到对应的控件

redView =findViewById(R.id.view);

}

//重写触摸回调的时间onTouch

//返回值表示这个事件是否已经被处理

//true:表示已经处理了 不会继续传递

//false:表示自己不消费 时间还要继续往下传

//系统自动将事件包装为MotionEvent类

//用户可以获取事件的行为:getAction(ACTION_DOWN 手放在屏幕上、ACTION_MOVE手在屏幕上滑动、ACTION_UP 手放开了、ACTION_CANCER 被打断了)

//获取触摸点的坐标:getX,getY

@Override

public boolean onTouchEvent(MotionEvent event) {

//获取事件对应的类型

//获取屏幕的大小

Point p=new Point();

getWindowManager().getDefaultDisplay().getSize(p);

System.out.println("屏幕宽度:"+p.x);

System.out.println("屏幕高度:"+p.y);

//获取容器本身的宽高

RelativeLayout rl=findViewById(R.id.root);

System.out.println("界面宽度:"+rl.getWidth());

System.out.println("界面高度:"+rl.getHeight());

//计算界面和屏幕之间的间距

//计算状态栏和标题栏的高度

float padding= p.y-rl.getHeight();

int action=event.getAction();

if(action==MotionEvent.ACTION_DOWN){

//按下

//获取触摸点的x坐标和y坐标

float x = event.getX() ;

float y = event.getY() - padding;

//改变控件的位置

redView.setX(x-(float)(redView.getWidth()*0.5));

redView.setY(y-(float)(redView.getWidth()*0.5));

}else if(action==MotionEvent.ACTION_MOVE){

//滑动

}else if(action==MotionEvent.ACTION_UP){

//离开屏幕

}else{

//被打断了

}

return true;

}

实现改变控件的颜色

public class MainActivity extends AppCompatActivity {

View redView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//通过id找到对应的控件

redView =findViewById(R.id.view);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

//更改控件的颜色

//redView.setBackgroundColor(Color.BLACK);

//找到父容器

RelativeLayout rl=findViewById(R.id.root);

//通过tag查找父容器下面的子控件

View iv=rl.findViewWithTag("1");

iv.setBackgroundColor(Color.TRANSPARENT);

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值