Android 选中“在视图外单击”
这是我的布局:Android 选中“在视图外单击”,android,layout,Android,Layout,这是我的布局: <?xml version="1.0" encoding="utf-8"?><!-- Style Theme.Transparent --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayoutVideo" android:layout_width="match_parent"
<?xml version="1.0" encoding="utf-8"?><!-- Style Theme.Transparent -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayoutVideo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:weightSum="1"
android:focusable="true"
android:clickable="true">
<VideoView
android:id="@+id/videoView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.75"
android:clickable="true"
android:focusable="true" />
</LinearLayout>
我只获得视频查看的点击事件。
我想知道的是,用户是点击视频视图还是点击外部(家长)并执行不同的操作。我如何获得这种行为
谢谢
Tata不久前,我实现了一个提供此类功能的
活动
基类。您只需在OutsideViewListener上注册一个自定义,一旦用户在安装了监听器后接触到您的视图之外,就会收到通知。只需在活动实例上调用setOnTouchOutsideViewListener
您可以将此代码粘贴到现有的活动类中,或者创建一个可以在整个项目中重用的基本活动类
class YourActivity extends Activity {
private View mTouchOutsideView;
private OnTouchOutsideViewListener mOnTouchOutsideViewListener;
/**
* Sets a listener that is being notified when the user has tapped outside a given view. To remove the listener,
* call {@link #removeOnTouchOutsideViewListener()}.
* <p/>
* This is useful in scenarios where a view is in edit mode and when the user taps outside the edit mode shall be
* stopped.
*
* @param view
* @param onTouchOutsideViewListener
*/
public void setOnTouchOutsideViewListener(View view, OnTouchOutsideViewListener onTouchOutsideViewListener) {
mTouchOutsideView = view;
mOnTouchOutsideViewListener = onTouchOutsideViewListener;
}
public OnTouchOutsideViewListener getOnTouchOutsideViewListener() {
return mOnTouchOutsideViewListener;
}
@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// Notify touch outside listener if user tapped outside a given view
if (mOnTouchOutsideViewListener != null && mTouchOutsideView != null
&& mTouchOutsideView.getVisibility() == View.VISIBLE) {
Rect viewRect = new Rect();
mTouchOutsideView.getGlobalVisibleRect(viewRect);
if (!viewRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
mOnTouchOutsideViewListener.onTouchOutside(mTouchOutsideView, ev);
}
}
}
return super.dispatchTouchEvent(ev);
}
/**
* Interface definition for a callback to be invoked when a touch event has occurred outside a formerly specified
* view. See {@link #setOnTouchOutsideViewListener(View, OnTouchOutsideViewListener).}
*/
public interface OnTouchOutsideViewListener {
/**
* Called when a touch event has occurred outside a given view.
*
* @param view The view that has not been touched.
* @param event The MotionEvent object containing full information about the event.
*/
public void onTouchOutside(View view, MotionEvent event);
}
}
class YourActivity扩展活动{
私有视图mTouchOutsideView;
私有OnTouchOutsideViewListener mOnTouchOutsideViewListener;
/**
*设置一个侦听器,当用户在给定视图外点击时,该侦听器将收到通知。若要删除该侦听器,
*调用{@link#removeOnTouchOutsideViewListener()}。
*
*这在视图处于编辑模式的情况下非常有用,并且当用户点击编辑模式之外的位置时,应
*停下来。
*
*@param视图
*@param onTouchOutsideViewListener
*/
public void setOnTouchOutsideViewListener(视图视图,OnTouchOutsideViewListener OnTouchOutsideViewListener){
mTouchOutsideView=视图;
mOnTouchOutsideViewListener=onTouchOutsideViewListener;
}
公共OnTouchOutsideViewListener getOnTouchOutsideViewListener(){
返回mOnTouchOutsideViewListener;
}
@凌驾
公共布尔dispatchTouchEvent(最终运动事件ev){
if(ev.getAction()==MotionEvent.ACTION\u向下){
//如果用户在给定视图外点击,则通知触摸外部侦听器
如果(mOnTouchOutsideViewListener!=null&&mTouchOutsideView!=null
&&mTouchOutsideView.getVisibility()==View.VISIBLE){
Rect viewRect=新的Rect();
mTouchOutsideView.getGlobalVisibleRect(viewRect);
如果(!viewRect.contains((int)ev.getRawX(),(int)ev.getRawY()){
OnTouchOut(mTouchOutsideView,ev);
}
}
}
返回超级dispatchTouchEvent(ev);
}
/**
*当触摸事件发生在以前指定的外部时调用的回调的接口定义
*视图。请参见{@link#setOnTouchOutsideViewListener(视图,OnTouchOutsideViewListener)。}
*/
OutsideViewListener上的公共接口{
/**
*在给定视图外部发生触摸事件时调用。
*
*@param view未触及的视图。
*@param event包含事件完整信息的MotionEvent对象。
*/
外部公共空间(视图、运动事件);
}
}
请显示您的myOnlyhandler代码。即使您在videoView之外单击,也会获得videoView的单击事件?总体回答不错。如果触摸在视图之外,您可能希望dispatchTouchEvent()返回true,以便使用触摸事件。此外,在MotionEvent.ACTION\u UP上触发更为常见。
class YourActivity extends Activity {
private View mTouchOutsideView;
private OnTouchOutsideViewListener mOnTouchOutsideViewListener;
/**
* Sets a listener that is being notified when the user has tapped outside a given view. To remove the listener,
* call {@link #removeOnTouchOutsideViewListener()}.
* <p/>
* This is useful in scenarios where a view is in edit mode and when the user taps outside the edit mode shall be
* stopped.
*
* @param view
* @param onTouchOutsideViewListener
*/
public void setOnTouchOutsideViewListener(View view, OnTouchOutsideViewListener onTouchOutsideViewListener) {
mTouchOutsideView = view;
mOnTouchOutsideViewListener = onTouchOutsideViewListener;
}
public OnTouchOutsideViewListener getOnTouchOutsideViewListener() {
return mOnTouchOutsideViewListener;
}
@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// Notify touch outside listener if user tapped outside a given view
if (mOnTouchOutsideViewListener != null && mTouchOutsideView != null
&& mTouchOutsideView.getVisibility() == View.VISIBLE) {
Rect viewRect = new Rect();
mTouchOutsideView.getGlobalVisibleRect(viewRect);
if (!viewRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
mOnTouchOutsideViewListener.onTouchOutside(mTouchOutsideView, ev);
}
}
}
return super.dispatchTouchEvent(ev);
}
/**
* Interface definition for a callback to be invoked when a touch event has occurred outside a formerly specified
* view. See {@link #setOnTouchOutsideViewListener(View, OnTouchOutsideViewListener).}
*/
public interface OnTouchOutsideViewListener {
/**
* Called when a touch event has occurred outside a given view.
*
* @param view The view that has not been touched.
* @param event The MotionEvent object containing full information about the event.
*/
public void onTouchOutside(View view, MotionEvent event);
}
}