长按事件
长按事件就是长按了某个控件而触发的事件。TextView、ImageView、Button 等控件经常会使用长按事件。另外,布局管理器(如 LinearLayout)也是可以有长按事件的。下面将以 LinearLayout 为实例来进行讲解。
MainActivity对应的布局文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/liner_click"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button //设置一个Button按钮
android:id="@+id/button_click"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是button按钮"/>
<TextView //设置一个TextView文本
android:id="@+id/text_click"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是textView"/>
</LinearLayout>
MainActivity中的处理代码:
package com.rfstar.clicktest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
{
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linearLayout=(LinearLayout)findViewById(R.id.liner_click);
button = (Button) findViewById(R.id.button_click);
textView = (TextView) findViewById(R.id.text_click);
linearLayout.setOnLongClickListener(new View.OnLongClickListener() {//以匿名内部类的方式传入事件处理接口的对象,设置长按事件
@Override
public boolean onLongClick(View view) {
Toast.makeText(MainActivity.this,"您长按了一个LinerLayout",Toast.LENGTH_LONG).show();
return true; //返回true时不会发生连带触发的情况
}
});
}
}
这里也只是在长按之后显示一个 Toast。长按一个控件时会触发点击事件、触摸事件等,这里返回值的作用就在于此,当设置返回 true 时将不会发生连带触发的情况。
运行程序,发现LinearLayout 确实是可以触发长按事件的,效果如下图:
触摸事件
触摸事件是指触摸了某个控件而触发的事件,在TextView、ImageView 等控件中比较常用,在 Button中也会使用。下面将以TextView为实例来进行讲解。实例在点击事件的基础上进行如下修改即可∶
package com.rfstar.clicktest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
{
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linearLayout=(LinearLayout)findViewById(R.id.liner_click);
button = (Button) findViewById(R.id.button_click);
textView = (TextView) findViewById(R.id.text_click);
linearLayout.setOnLongClickListener(new View.OnLongClickListener() {//以匿名内部类的方式传入事件处理接口的对象,设置长按事件
@Override
public boolean onLongClick(View view) {
Toast.makeText(MainActivity.this,"您长按了一个LinerLayout",Toast.LENGTH_LONG).show();
return true; //返回true时不会发生连带触发的情况
}
});
textView.setOnTouchListener(new View.OnTouchListener() {//以匿名内部类的方式传入事件处理接口的对象,设置触摸事件
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Toast.makeText(MainActivity.this,"您触摸了一个TextView,它的坐标是:"+"X="+motionEvent.getX()+",Y="+ motionEvent.getY(),
Toast.LENGTH_LONG).show();
return false;
}
});
textView.setOnClickListener(new View.OnClickListener() {//以匿名内部类的方式传入事件处理接口的对象,设置点击事件
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您点击了一个TextView",
Toast.LENGTH_LONG).show();
}
});
}
}
这里也只是在触摸之后显示一个 Toast。触摸一个控件时必然会有一个按下与弹起的过程,这会连带触发点击事件,返回值的作用就在于此,当设置返回 true 时就不再发生连带触发的效果。
另外,触摸事件与其他事件不同的地方在于它在用户触摸控件之后会返回一个 MotionEvent 对象,使用此对象可以获取控件的坐标。
完成上述改动之后,运行程序,通过手指触摸TextView 文本就可以触发触摸事件,如下图所示。
但是在触摸事件被触发之后依旧会执行点击事件,如下图所示。
所以一般在开发中我们并不会在设置了点击事件后再去设置触摸事件。
源码下载地址:
链接:https://pan.baidu.com/s/1ExoSxaQRdjmwUUnDuSbUIQ
提取码:43ka