小弟最近在网上查了一些资料,然后自己写了一个程序,就是当你在屏幕的规定区域长安时会弹出设置壁纸的对话框 ,在模拟器上面可以实现,但是在真机上运行时,不能够实现,接上串口打印信息看到:event.getEventTime()和event.getDownTime()值相等,有哪位大侠能够帮忙给解决一下,或则提供一些长按响应的思路也可以,小弟我搞了两天了还是不能搞定真机上面实现长按的响应....
小弟的代码如下:
package com.sampleactivity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public  class SampleActivity extends Activity {
private static final int REQUEST_PICK_WALLPAPER = 10;
public static int screenWidth = 0;
public static int screenHeight = 0;
static boolean  mIsLongPressed;
/** Called when the activity is first created. */
   /* public void onCreate1(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Gallery g=(Gallery)findViewById(R.id.Gallery01);
        g.setAdapter(new ImageAdapter(this));
        //g.setBackgroundColor(R.drawable.taikong);
        g.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent,View v,int position,long id)
         {
         Toast.makeText(SampleActivity.this, "你选择了"+(position+1)+"号图片",
         Toast.LENGTH_LONG).show();
         }
        });
        }
        /** Called when the activity is first created. */        public void onCreate(Bundle savedInstanceState) {
      
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                DisplayMetrics displayMetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                screenWidth = displayMetrics.widthPixels;
                screenHeight = displayMetrics.heightPixels;
                Log.d("mainActivity","displayMetrics.widthPixels is: " + screenWidth);
                Log.d("mainActivity","displayMetrics.heightPixels is: " + screenHeight);
               
                
                final CoverFlow cf = new CoverFlow(this);
                                cf.setAdapter(new ImageAdapter(this));
                ImageAdapter imageAdapter = new ImageAdapter(this);
                cf.setAdapter(imageAdapter);
                cf.setAnimationDuration(1500);
                setContentView(cf);
                cf.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent,View v,int position,long id)
                 {
                 Toast.makeText(SampleActivity.this, "你选择了"+(position+1)+"号图片",
                 Toast.LENGTH_LONG).show();
                 }
                }); 
        }   private boolean isLongPressed(float lastX,float lastY,float thisX,float thisY,long lastDownTime,long thisEventTime,long longPressTime)
   {
        float offsetX = Math.abs(thisX - lastX);
        float offsetY = Math.abs(thisY - lastY);
       long intervalTime = Math.abs(thisEventTime - lastDownTime);
      if( offsetX <=10 && offsetY<=10 && intervalTime >= longPressTime)
        {
       return true;
        }
 return false;
}
    public boolean onTouchEvent(MotionEvent event) 
                {    
                  float x=event.getX();
                  float y=event.getY();
              Rect btnRect1 = new Rect(0, 0, screenWidth , screenHeight/4);
              Rect btnRect2 = new Rect(0, 3*screenHeight/4, screenWidth ,screenHeight);   
              float lastx=event.getX();
                 float lasty=event.getY();
                long   lastDownTime = event.getEventTime();
                   Log.d("lastDownTime" ,"********lastDownTime is :"+lastDownTime);
                mIsLongPressed=false;
                Log.d("Touchevent","mIsLongPressed=false*************");
      if(btnRect1.contains((int)x,(int)y)||btnRect2.contains((int)x,(int)y))
                  {
                       Log.d("Touchevent","enentoutView3333333333333333333333333*************");
                           if(MotionEvent.ACTION_UP == event.getAction())
                          {
                            Log.d("Touchevent","Excute to this 3333333222222222*************");   
                           float thisx=event.getX();
                              float thisy=event.getY();
                               long thisDownTime=event.getEventTime(); 
                               Log.d("thisDownTime" ,"thisDownTime is :"+thisDownTime+"actiondowntime = "+event.getDownTime());
                              // long thisDownTime2=event.getDownTime();
                            //  Log.d("thisDownTime" ,"thisDownTime is :"+thisDownTime2);
                              Log.d("Touchevent","mIsLongPressed="+mIsLongPressed);
                            if(!mIsLongPressed)
                            {
                           mIsLongPressed = isLongPressed(lastx, lasty, thisx, thisy, lastDownTime,thisDownTime,500);
                           Log.d("lastDownTime" ,"mIsLongPressed ="+mIsLongPressed);
                            }
                          if(mIsLongPressed)
                          {
                        Log.d("ActivityMain","onLongClick111111111*************");
                              final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
                           Intent chooser = Intent.createChooser(pickWallpaper,
                           getText(R.string.select_wallpaper));
                           startActivityForResult(chooser, REQUEST_PICK_WALLPAPER);
                         }
                         } 
                   
            }          
                        return true;  
             }
                  
public  class ImageAdapter extends BaseAdapter {
                int mGalleryItemBackground;
                private Context mContext;
                
               
                public ImageAdapter(Context c) {
                        mContext = c;
                    //产生相框之类的
                                                                     
                       // TypedArray a = obtainStyledAttributes(R.styleable.Gallery);               
                                 
                       // mGalleryItemBackground = a.getResourceId        
                      //  (R.styleable.Gallery_android_galleryItemBackground, 10);               
                                                                          
                     //   a.recycle();  
                     
                }
            /*返回图像总数*/
                public int getCount() {
                        return mImageIds.length;
                }                public Object getItem(int position) {
                        return position;
                }                public long getItemId(int position) {
                        return position;
                }                public View getView(int position, View convertView, ViewGroup parent) {
                        ReflectionImage i = new ReflectionImage(mContext);                        if (convertView == null) {
                         // 返回具体位置的ImageView对象
                                /*设置当前图像的图像(position为当前图像列表的位置)*/
                                i.setImageResource(mImageIds[position]);
                                /* 设置这个ImageView对象的宽高,单位为dip */
                                i.setLayoutParams(new CoverFlow.LayoutParams(200, 300));
                                /*声明图片应该向中心剪裁(如果需要的话)*/
                               // i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
                                i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
                                /*定义补距,如果图片有不同的横纵比,小的补距将导致更多的剪裁以适合设置的ImageView的高度和宽度*/
                                //i.setPadding(8, 8, 8, 8);
                                i.setBackgroundResource(mGalleryItemBackground);
                                 /*设置Gallery组件的背景风格*/
                                BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();
                                drawable.setAntiAlias(true);
                        
                        } else {
                                i = (ReflectionImage) convertView;
                        }
                        return i;
                }
                
                private Integer[] mImageIds = {R.drawable.img1, R.drawable.img2, R.drawable.img3,R.drawable.img4,
                         R.drawable.img5, R.drawable.img6, R.drawable.img7,  R.drawable.img8};
                public float getScale(boolean focused, int offset) {
                        return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
                }
    }
}
      

解决方案 »

  1.   

    在activity 中 实现父类onTouchEvent 方法 @Override
    public boolean onTouchEvent(MotionEvent event) {
    // 获得触摸的坐标
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch (event.getAction()) {
    // 触摸屏幕时刻
    case MotionEvent.ACTION_DOWN:
    UpdateTouchEvent(x, y);
    break;
    // 触摸并移动时刻
    case MotionEvent.ACTION_MOVE:
    break;
    // 终止触摸时刻
    case MotionEvent.ACTION_UP:
    break;
    }
    return super.onTouchEvent(event);
    }
      

  2.   

    这个可以吗?这只是实现了屏幕上的单击处理事件!如果可以的话,那你还不如为整个activity注册一个OnClickListener!那样更直接些!当你单击屏幕上的任意一点都会触发该事件!
      

  3.   

    这样不行的,它需要判断点击屏幕的时间的长短,当超过规定的阈值时,才会触发事件一楼的思路可以考虑下,就是需要计算ACTION_DOWN和ACTION_UP事件间的时间间隔
      

  4.   

    我的模拟上捕捉不到 case MotionEvent.ACTION_DOWN这个事件,
    不过还是谢谢你们能够积极的帮我
      

  5.   

    应该是可以的,只要你的代码没有错的话,SDK和手机上的是不是都是一样的,是不是都是标准的