视图之间有什么区别onTouchEvent
:
public class MyCustomView extends View {
// THIS :
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
Run Code Online (Sandbox Code Playgroud)
及其onTouchListener
:
MyCustomView myView = (MyCustomView) findViewById(R.id.customview);
myView.setOnTouchListener(new View.OnTouchListener() {
@Override
public void onClick(View arg0) {
// do something
}
});
Run Code Online (Sandbox Code Playgroud)
要么
public class MyCustomView extends View {
public MyCustomView(Context context, AttributeSet attrs) {
// THIS :
setOnTouchListener(new View.OnTouchListener() {
@Override
public void onClick(View arg0) {
// do something
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) …
Run Code Online (Sandbox Code Playgroud) 我有一个垂直的LinearLayout
.它应该作为快速跳跃杆.因此宽度非常小,高度几乎匹配整个屏幕高度.当我触摸它并在里面移动时,一切都很好.这意味着,我onTouchEvent()
被召唤,我可以得到(并跟随)手指的位置.但由于条形图不是很宽,因此用户可以轻松地漂移到该视图之外.因此,即使在视图之外,也必须让用户继续运动.事实上同样的事情就像ListView
一样.
我不知道为什么ListView
的onTouchEvent()
是,即使外面的时候叫ListView
,但不是在我的情况LinearLayout
.我把它追溯到了dispatchTouchEvent()
.这里的情况是相同的,即总是调用方法ListView
(即使在外面),但在LinearLayout
(在外面移动时)的情况下也不需要.
如果有人能给我一个提示,我会很高兴.非常感谢!
贝恩德
当touchend
事件绑定到touchstart
触发的元素时,如何将元素放在手指离开的位置,此时元素位于绑定事件的元素之外.
我有一个启动系统覆盖的服务.当叠加层可见时,我希望它是可触摸/检测触摸,但我想保持与它后面的屏幕的交互(后面我的意思是底层活动,例如叠加层旁边).
我的叠加层是128x128px的位图/ PNG.它被绘制,当我点击它时,我收到了触摸!记录,这很好.但是当我点击屏幕的任何其他部分时(除了叠加层)我也会接触到!记录并且没有与它下面的屏幕的交互是可能的.
以下是我的代码部分:
主要活动启动服务
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// start Service and return to Homescreen
Intent i = new Intent(MainActivity.this, MyService.class);
startService(i);
Intent newActivity = new Intent(Intent.ACTION_MAIN);
newActivity.addCategory(Intent.CATEGORY_HOME);
newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newActivity);
}
});
Run Code Online (Sandbox Code Playgroud)
服务/显示覆盖
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myOverlay = new Overlay(MyService.this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.TOP;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(myOverlay, params);
myOverlay.setAnimation(new Waiting(MyService.this, 0, 0)); …
Run Code Online (Sandbox Code Playgroud) 我正在使用自定义布局(文本视图和切换)和自定义适配器构建简单的回收站视图.
我的问题是我无法处理交换机的点击事件(这使其切换状态),我已经为RecyclerView
它构建了一个触摸监听器,每次点击它都会触发Switch
.
经过大量试验后,开关触摸监听器也会触发,但如果单击该开关,我想禁用recyclelerView的触摸事件.
这是我的布局代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="60.0dip"
android:layout_weight="1.0"
android:orientation="horizontal"
android:paddingLeft="16dp">
<TextView
android:id="@+id/category_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="false"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical"
android:text="Category Name"
android:textAppearance="?android:textAppearanceLarge" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/category_switch"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical"
android:checked="true"
android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"
android:paddingRight="16dp" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的适配器代码:
public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View row = layoutInflater.inflate(R.layout.single_row_category, parent, false);
CategoryViewHolder holder = new CategoryViewHolder(row);
return holder;
}
public void onBindViewHolder(CategoryViewHolder holder, final int position) {
AlarmCategory thisCat = categories.get(position);
holder.catName.setText(thisCat.getCategoryName());
holder.catStatus.setChecked(thisCat.isOn());
holder.catStatus.setOnTouchListener(new View.OnTouchListener() …
Run Code Online (Sandbox Code Playgroud) 在我们的应用程序中,我们处理按钮中的事件以记录数据.
所以最初当我使用setOnLongClickListener()
和setOnClickListener()
使用相同的按钮时,它对我们来说很好.
这意味着它将基于Click和LongClick按钮调用此侦听器.现在,当我尝试使用setOnTouchListener()
相同的按钮setOnLongClickListener()
,setOnClickListener()
然后只有OnTouch事件正在工作,休息onclick和onLongclick事件不起作用.
任何人都可以告诉我为什么会发生这种情况,如果可能的话,请举例说明
我使用的代码是..
Button btnAdd=new Button(this)
btnAdd.setOnLongClickListener(this);
btnAdd.setOnClickListener(this);
btnAdd.setOnTouchClickListener(this);
public void onClick(View v)
{
//Statements;
}
public void onLongClick(View v)
{
//Statements;
}
public boolean onTouch(View v, MotionEvent e)
{
switch (e.getAction())
{
case MotionEvent.ACTION_DOWN:
{
//store the X value when the user's finger was pressed down
m_downXValue = e.getX();
break;
}
case MotionEvent.ACTION_UP:
{
//Get the X value when the user released his/her finger
float currentX = …
Run Code Online (Sandbox Code Playgroud) 我使用以下代码来检测单指触摸和双指触摸.代码检测到双指触摸(何时count==2
).
我也需要在单点触控上做一些动作.如果我用一根手指触摸屏幕,它就不会用于其他部分.我在这段代码中做错了什么?
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_POINTER_UP: {
int count = event.getPointerCount();
Log.v("count >>", count + "");
if (count == 2) {
// some action
} else {
Log.v("count not equal to 2", "not 2");
}
break;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
更新:
我在里面用了这个代码Activity
.我需要检测单点触控,多点触控.
在我的活动中,我有两个图像,一个在左边,一个在右边.如果我点击图像,一些过程必须要做.如果我用两根手指,我需要重新调整图像大小scale-factor
.
这是我用过的代码:
更新:
package com.pinch.detect;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个主要用于ipad的jquery组件.所以无论如何都要在桌面上模拟'touchstart和'touchend'事件,而不是让设备本身来检查事件.
我写了一个代码的和平,以触摸和非触摸为基础的事件.它适用于所有其他浏览器和设备,但Firefox.默认FF返回true
.
var thumbsEvent, isTouch = Modernizr.touch; // detect the touch
if(isTouch){
thumbsEvent = 'click';//on touch surface, click
}
else {
thumbsEvent = 'mouseover';//on non touch surface, mouseover
}
Run Code Online (Sandbox Code Playgroud)
有没有办法管理这个问题.
有一些C#库允许通过安装全局挂钩来监听低级Windows调用来捕获鼠标和键盘事件,但是它们都不允许捕获Windows 8 Stylus压力.如果有人可以告诉我Touch事件ID是什么以及允许通过ID监听所有低级窗口事件的应用程序,例如WM_KEYUP,特别是那些与Touch事件相关的事件,我将不胜感激.
我能够通过听鼠标和按钮事件来检测手写笔坐标,但无法获得有关压力的信息.有任何想法吗?
总结: - 是否有一个C#库允许以全局方式(不依赖于单个应用程序)拦截Touch相关事件,特别是触控笔? - 如果没有,是否有人知道Touch相关事件的硬件ID和事件ID以及如何解码他们的数据?(我正在寻找压力) - 有人可以推荐我一个应用程序来收听和过滤HID和事件名称的低级别窗口事件吗?
提前致谢.