Android onInterceptTouchEvent和dispatchTouchEventAndroid有什么区别?
根据android开发者指南,这两种方法都可以用来拦截触摸事件(MotionEvent),但有什么区别?
怎么办onInterceptTouchEvent,dispatchTouchEvent和onTouchEvent视图的层次结构中一起互动(ViewGroup)?
java android event-listener event-handling android-touch-event
虽然大多数苹果文档编写得很好,但我认为" iOS事件处理指南 "是一个例外.我很难清楚地了解那里描述的内容.
该文件说,
在命中测试中,窗口调用
hitTest:withEvent:视图层次结构的最顶层视图; 此方法通过递归调用pointInside:withEvent:视图层次结构中返回YES的每个视图继续进行,继续向下移动层次结构,直到找到触摸发生在其边界内的子视图.该视图成为热门测试视图.
那么只有hitTest:withEvent:系统调用最顶层的视图,调用pointInside:withEvent:所有子视图,如果从特定子视图返回是YES,那么调用pointInside:withEvent:该子视图的子类?
我创造了一个onTouchListener.不幸的是onTouch()方法throws我警告:
Run Code Online (Sandbox Code Playgroud)com/calculator/activitys/Calculator$1#onTouch should call View#performClick when a click is detected
这是什么意思?我没有找到有关此警告的任何信息.这是完整的代码:
LinearLayout llCalculatorContent = (LinearLayout) fragmentView.findViewById(R.id.calculator_content);
llCalculatorContent.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Tools.hideKeyboard(getActivity(), getView());
getView().clearFocus();
return false;
}
});
Run Code Online (Sandbox Code Playgroud) 我正在调试Android上的一些触摸处理内容,并试图找出发送到我的View的MotionEvent onTouchListener包含取消操作的原因.我无法找到有关其原因的任何文档,并希望有人能指出我正确的方向来调试此问题 - 错误代码,源代码或一些常识.
为什么ViewGroup唯一得到ACTION_DOWN的onInterceptTouchEvent?根据文档,只要返回false,它就应该接收所有事件类型.
http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29
第3点.
示例代码:
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new Container(this));
}
private class Container extends LinearLayout {
public Container(Context context) {
super(context);
setBackgroundColor(0xFF0000FF);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(TAG, "onInterceptTouchEvent");
int action = ev.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onInterceptTouchEvent.ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onInterceptTouchEvent.ACTION_MOVE");
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
Log.i(TAG, "onInterceptTouchEvent.ACTION_UP");
break;
}
return …Run Code Online (Sandbox Code Playgroud) 我有以下类,表示可触摸的视图并绘制幻灯片栏.
public class SlideBar extends View {
private int progress;
private int max;
private Paint background;
private Paint upground;
private RectF bar;
private boolean firstDraw;
public SlideBar(Context context, AttributeSet attrs) {
super(context, attrs);
progress = 0;
upground = new Paint();
upground.setColor(Color.parseColor("#C2296C"));
background = new Paint();
background.setColor(Color.parseColor("#777777"));
}
private void onFirstDraw() {
max = getWidth();
bar = new RectF(0, 19, max, 21);
}
public void onDraw(Canvas canvas) {
if (!firstDraw) {
onFirstDraw();
progress = max;
firstDraw = true;
}
canvas.save();
canvas.drawRoundRect(bar, …Run Code Online (Sandbox Code Playgroud) 我有一个EditText电话myTextview.我希望软键盘在我点击时显示,EditText但如果我点击外面则解雇EditText.所以我使用下面的方法.但是当我在视图外面点击时键盘不会被忽略(我点击了一下TextView).我该如何修复此代码?
myTextview.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
} else {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myTextview.getWindowToken(), 0);
}
}
});
Run Code Online (Sandbox Code Playgroud) 我想跟踪屏幕上的手指触摸.所以我所做的就是在MotionEvent触发时开始记录位置ACTION_DOWN,但我怎么知道动作何时结束ACTION_CANCEL,或者ACTION_UP?
它们之间的确切区别是什么?
执行以下操作后,我的按钮保持在突出显示状态时出现问题:
public class MainActivity extends AppCompatActivity {
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton button = (AppCompatButton) findViewById(R.id.mybutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Test", "calling onClick");
}
});
button.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.getBackground().clearColorFilter();
v.invalidate();
v.performClick();
Log.d("Test", "Performing click");
return true;
}
}
return false;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
关于上面的代码,在使用它时,我希望按钮单击由触摸来处理,并且通过返回“ true”,处理应在touchListener处停止。
但这种情况并非如此。即使正在调用单击,按钮仍保持突出显示状态。
我得到的是:
Test - …Run Code Online (Sandbox Code Playgroud) I have a RecyclerView that displays an Button which extends outside its parent ViewHolder. To the button I added a clickListener to display a toast. If you click on the Button and the click is on the area of the Button parent ViewHolder, the toast shows, but if you click on the button but outside its parent ViewHolder the toast doesn't show anymore.
Here's what I currently have
RecyclerView:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:focusedByDefault="false"
android:scrollbars="horizontal" …Run Code Online (Sandbox Code Playgroud)