仅做记录
自定义view,没有多余的东西,只是打一个log
package com.example.testintercept;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Created by Android Studio
* Date: 2021/1/27
* Time: 17:03
*/
public class TestButton extends androidx.appcompat.widget.AppCompatButton {
private static final String TAG = "TestButton";
public TestButton(@NonNull Context context) {
super(context);
}
public TestButton(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public TestButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.e(TAG, "onTouchEvent: " );
return super.onTouchEvent(ev);
}
}
mainActivity:
package com.example.testintercept
import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import com.example.testview.R
import kotlinx.android.synthetic.main.activity_test_view_on_intercept_touch_event.*
/**
* 测试拦截
*
* 主要针对ViewGroup以及View拦截后对于onTouchEvent
*
*/
class TestViewOnInterceptTouchEvent : AppCompatActivity(), View.OnClickListener {
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test_view_on_intercept_touch_event)
ll_test2.setOnClickListener(this)
test2_button.setOnClickListener(this)
test2_button1.setOnClickListener(this)
test2_button1.setOnLongClickListener {
Log.e(Companion.TAG, "onCreate: test2_button1 setOnLongClickListener")
true
}
test2_button1.setOnTouchListener( object :View.OnTouchListener{
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
Log.e(TAG, "onTouch: setOnTouchListener" )
return false
}
})
}
override fun onClick(v: View) {
when (v.id) {
R.id.ll_test2 -> {
Toast.makeText(this, "ll_test2", Toast.LENGTH_SHORT).show()
}
R.id.test2_button -> {
Toast.makeText(this, test2_button.text, Toast.LENGTH_SHORT).show()
}
R.id.test2_button1 -> {
Log.e(Companion.TAG, "onCreate: test2_button1 onClick")
Toast.makeText(this, test2_button1.text, Toast.LENGTH_SHORT).show()
}
}
}
companion object {
private const val TAG = "TestViewOnInterceptTouc"
}
}
当
test2_button1.setOnTouchListener( object :View.OnTouchListener{
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
Log.e(TAG, "onTouch: setOnTouchListener" )
return false
}
})
返回true 时,表示事件自己处理,不会走自己定义的onTouchEvent方法,当然onclick与OnLongClickListener也不会运行。
如果返回false的时候,自己的OnTouchListener和onTouchEvent,onclick与OnLongClickListener也会相继调用。
所以事件的调度顺序应该是 onTouchListener > onTouchEvent > onLongClickListener 、 onClickListener。
暂时是这样。