我正在尝试为我的游戏添加游戏手柄支持但我无法在任何地方找到如何从游戏手柄的操纵杆获取动作事件.
我有类似的东西,但它似乎永远不会被召唤或做任何事情.我正在使用JellyBean测试XOOM,我的游戏手柄用于浏览菜单.
@Override
public boolean onGenericMotionEvent(MotionEvent e) {
if ((e.getDevice().getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
float x = e.getX();
float y = e.getY();
mJoy1.set(x, y);
mJoy2.set(-1,1);
mRenderer.onAxisMoved(mJoy1, mJoy2);
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如何从游戏手柄中读取轴数据?
我在OnTouchListener中遇到MotionEvent问题.ACTION_DOWN完美的工作,但它永远不会使用ACTION_UP我真的不知道我的问题在哪里,所以如果有人可以帮助我,那将是非常好的,谢谢.
public class MainActivity extends Activity {
View.OnTouchListener gestureListener;
private static final int MIN_DISTANCE = 50;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
layout.setOnTouchListener(new View.OnTouchListener() {
float downX = 0, downY;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
downX = event.getX();
downY = event.getY();
Toast.makeText(getApplicationContext(), "action down", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP :
Toast.makeText(getApplicationContext(), "action up", Toast.LENGTH_SHORT).show();
float deltaX = downX - event.getX(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试简单的程序,如果移动有声音.所以在开始的时候我已经失声了 - 播放声音1然后每次移动它都会继续播放声音.在第4阶段,我从头开始玩.
问题在于:当我不移动我的手指并将其保持在同一位置时,声音仍然保持1比1 - 计算出x和y值的触发.我怎么阻止这个?
OnTouchListener MyOnTouchListener= new OnTouchListener()
{
public boolean onTouch(View view, MotionEvent event)
{
switch(event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
x = (int) event.getX();
y = (int) event.getY();
oldval = x+y;
break;
case MotionEvent.ACTION_MOVE:
{
Log.e("X value", "X is "+x);
Log.e("Y value", "Y is "+y);
try
{
Thread.sleep(500);
} catch (InterruptedException e) {
}
int newval= (int) (event.getX() + event.getY());
if(Math.abs(oldval-newval)>50)
{
Log.e("First", "next button");
longpressCount++;
if(longpressCount==1)
{
Log.e("1", "BUTTON PRESSED");
}
else if(longpressCount==2)
{
Log.e("2", …Run Code Online (Sandbox Code Playgroud) 用户将触摸图像,如果他将手指放在该图像中是非常重要的
我尝试写一个onTouchListner()和之后使用swich case但我不知道如何继续
image.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
提前致谢
您好
我在我的应用程序中为ImageView设置了一个onTouchListener,我的目标是拥有一个用户可以在应用程序中拖动并放置在任意位置的ImageView.
我已经使用网络上的示例代码编写了一些代码,我认为它可以用于onTouchListener但是我遇到了一些问题,而不是让我拖动图像,图像调整大小并变大或变小你用手指拖过它.
有没有人有任何想法?
这是我的代码:
ImageView t1img;
t1img = (ImageView) findViewById(R.id.imgT1);
windowWidth = getWindowManager().getDefaultDisplay().getWidth();
windowHeight = getWindowManager().getDefaultDisplay().getHeight();
t1img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
layoutParams = (LayoutParams) t1img.getLayoutParams();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int xCoord = (int) event.getRawX();
int yCoord = (int) event.getRawY();
if (xCoord > windowWidth) {
xCoord = windowWidth;
}
if (yCoord > windowHeight) {
yCoord = windowHeight;
}
layoutParams.leftMargin = xCoord - 25;
layoutParams.topMargin = yCoord - 75;
t1img.setLayoutParams(layoutParams);
break; …Run Code Online (Sandbox Code Playgroud) 根据android MotionEvent文档:在按下手势(ACTION_DOWN和之间ACTION_UP)发生了更改。运动包含最近的点以及自上次下移或移动事件以来的任何中间点。
所以,当我应用setOnTouchListene上我的看法是完美的作品,它给我ACTION_DOWN,ACTION_UP和ACTION_MOVE
但是我的问题是我只想忽略ACTION_DOWN之前发生的事件ACTION_MOVE。因为ACTION_MOVE事件仅ACTION_DOWN根据其文档在事件之后发生。
我的编码:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
Log.e("Mouse: ", "Click");
break;
case MotionEvent.ACTION_MOVE:
Log.e("Mouse: ", "Move");
break;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
因此,有什么原因可以忽略ACTION_DOWN事件。因为用户只想移动就不想单击,而且ACTION_MOVE还发生ACTION_DOWN在它自己执行之前。
谢谢...
android motion-detection multi-touch android-button motionevent
我有一个充满卡片的父回收视图,每张卡片内部都有一个内部回收视图。
卡片内内部 recyclerview 的滚动已被禁用,但这也影响了内部 recyclerview 接收点击事件的能力。
为了禁用滚动,我遵循了与 Lucas Crawford 的回答非常相似的方法here,它建议您创建一个自定义的 recyclerview 类并覆盖 dispatchTouchEvent: Disable Scrolling in child Recyclerview android
我的课是这样的:
public class ScrollThroughRecyclerView extends RecyclerView {
private boolean isOnClick;
public ScrollThroughRecyclerView(Context context) {
super(context);
}
public ScrollThroughRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScrollThroughRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
final int actionMasked = action & MotionEvent.ACTION_MASK;
Log.e("actionmasked", "" + actionMasked);
switch (actionMasked) …Run Code Online (Sandbox Code Playgroud) 我正在使用a GestureDetector.OnGestureListener来实现Android中的双指缩放.我正在扩展一个TextView类,因此该方法setTextSize()已经实现.以下是我的代码onScroll().
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if(LOGGING) Log.v(MODULE_NAME, "onScroll()");
float x, y;
float oldDist, newDist;
if (e2.getPointerCount() == 2 &&
((e2.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE)) {
x = e2.getHistoricalX(0, 0) - e2.getHistoricalX(1, 0);
y = e2.getHistoricalY(0, 0) - e2.getHistoricalY(1, 0);
oldDist = FloatMath.sqrt(x * x + y * y);
if (oldDist > 10) {
if (LOGGING) Log.d(MODULE_NAME, "Starting ZOOM mode");
x = e2.getX(0) - e2.getX(1); …Run Code Online (Sandbox Code Playgroud) 我想要的是:用户将按钮保持点击 1900 毫秒。如果他在 1900 毫秒之前拿起手指,手机就会停止振动。而如果他将手指放在按钮上超过 1900 秒,calculate()方法就会运行。 我正在使用:postDelayed,因为我阅读它不会干扰 ui 线程。我试图检查 1900 秒是否已经过去,用户还没有选择他的手指,甚至比计算方法运行还要好。 发生错误:如果用户在 1900 秒之前拿起他的手指或只是他触摸并立即拿起,手机会一直振动。虽然它不应该发生,因为我正在使用 MotionEvent.ACTION_UP 检查它。请帮忙 !!
int flag = 0;
int aborted_flag = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
Handler mHandler = new Handler();
if(event.getAction()==MotionEvent.ACTION_DOWN){
scanning();
t1 = System.currentTimeMillis();
vibrator.vibrate(1900);
mHandler.postDelayed(new Runnable() {
public void run() {
check();
}
}, 1901);
}
if(event.getAction()==MotionEvent.ACTION_UP){
if(flag == 0){
t2 = System.currentTimeMillis();
vibrator.cancel();
calculate();
aborted_flag = 1;
}
}
return true;
}
private …Run Code Online (Sandbox Code Playgroud) 在activity使用
public boolean dispatchTouchEvent(MotionEvent ev)
我怎么知道用户正在触摸Y-axis 20%边缘区域的左侧?
它应该是通用的,并且应该处理方向。我不想在上面创建任何隐藏的视图。
android ×10
motionevent ×10
button ×1
exception ×1
imageview ×1
java ×1
multi-touch ×1
postdelayed ×1