鼠标向左 字体缩小
鼠标向右 字体放大
MainActivity
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 事件有三个方法
* 1:事件分发 dispatchTouchEvent 2:事件拦截 onInterceptTouchEvent 3:事件响应 onTouchEvent
* 从一个按钮的点击事件进去执行流程
* 1:先走Activity 2:ViewGroup 3:具体到点的那个控件
*/
public class MainActivity extends AppCompatActivity {
private float x1, x2;
private int mSize;
private Button Click_Btn;
private ImageView Image_View;
private TextView tv_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
Click_Btn = (Button) findViewById(R.id.Click_Btn);
Image_View = (ImageView) findViewById(R.id.Image_View);
tv_name = (TextView) findViewById(R.id.tv_name);
Click_Btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("onClick", "被点击了");
}
});
Click_Btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("onTouch", event.getAction() + "动作");
return false;
}
});
//直接通过方法让按钮直接被执行
Click_Btn.performClick();
Image_View.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("Image", event.getAction() + "");
return false;
}
});
}
//事件分发 true代表这个事件被消费掉过后就不能往下执行了 false没有被消费会一直往下边传递
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
if (x2 - x1 > 0) {
mSize += 5;
tv_name.setTextSize(mSize);
} else {
mSize -= 5;
tv_name.setTextSize(mSize);
}
break;
}
return super.onTouchEvent(event);
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/Click_Btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click" />
<ImageView
android:id="@+id/Image_View"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_name"
android:layout_gravity="center"
android:textSize="20dp"
android:text="字体"/>
</LinearLayout>
事件处理的过程
我们先看下下面的表格:
类型 | 相关方法 |
---|---|
事件分发 | dispatchTouchEvent |
Activity ViewGroup View | √ √ √ |
事件拦截 | onInterceptTouchEvent |
Activity ViewGroup View | X √ X |
事件消费 | onTouchEvent |
Activity ViewGroup View | √ √ √ |
从上表可以看到 Activity 和 View 都是没有事件拦截的,这是因为:
Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕都无法响应事件,这肯定不是我们想要的效果。
View最为事件传递的最末端,要么消费掉事件,要么不处理进行回传,根本没必要进行事件拦截。
view的传递流程应该是这样:
Activity -> PhoneWindow -> DecorView -> ViewGroup -> ... -> View
而view的处理恰恰相反,那就是这样:
Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View