本来想通过手指的左右滑动实现Activity之间的跳转,这个通过手势识别就可以轻松的实现,但是我发现加上listview后,界面的识别就比较混乱了,找了半天
终于找到了解决办法,什么也不说,上代码。
首先整体代码。
public class MainActivity extends Activity implements OnTouchListener,OnGestureListener { private List<Map<String, Object>> mData; ListView listView; LinearLayout layout; private GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); listView=(ListView) this.findViewById(R.id.listview); layout=(LinearLayout) this.findViewById(R.id.linearlayout); mGestureDetector=new GestureDetector(this); mData=getData(); MyAdapter adapter=new MyAdapter(this); listView.setAdapter(adapter); layout.setOnTouchListener(this); layout.setFocusable(true); layout.setClickable(true); layout.setLongClickable(true); mGestureDetector.setIsLongpressEnabled(true); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub mGestureDetector.onTouchEvent(ev); return super.dispatchTouchEvent(ev); } private List<Map<String, Object>> getData() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "G1"); map.put("img", R.drawable.bomb10); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G2"); map.put("img", R.drawable.bomb11); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G3"); map.put("img", R.drawable.bomb12); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G4"); map.put("img", R.drawable.bomb13); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G5"); map.put("img", R.drawable.bomb14); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G6"); map.put("img", R.drawable.bomb15); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G7"); map.put("img", R.drawable.bomb16); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G8"); map.put("img", R.drawable.bomb5); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G9"); map.put("img", R.drawable.bomb6); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G10"); map.put("img", R.drawable.bomb7); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G11"); map.put("img", R.drawable.bomb8); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G12"); map.put("img", R.drawable.bomb9); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G13"); map.put("img", R.drawable.bomb10); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G14"); map.put("img", R.drawable.bomb11); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G15"); map.put("img", R.drawable.bomb12); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G16"); map.put("img", R.drawable.bomb13); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G17"); map.put("img", R.drawable.bomb14); list.add(map); map = new HashMap<String, Object>(); map.put("title", "G18"); map.put("img", R.drawable.bomb15); list.add(map); return list; } // ================================================================================= //listview的adapter public final class ViewHolder{ public ImageView img; public TextView title; } public class MyAdapter extends BaseAdapter{ private LayoutInflater mInflater; public MyAdapter(Context context){ this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder=new ViewHolder(); convertView = mInflater.inflate(R.layout.item, null); holder.img = (ImageView)convertView.findViewById(R.id.img); holder.title = (TextView)convertView.findViewById(R.id.title); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); } holder.img.setBackgroundResource((Integer)mData.get(position).get("img")); holder.title.setText((String)mData.get(position).get("title")); return convertView; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } //============================================================================================ //手势识别部分 @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return mGestureDetector.onTouchEvent(event); } @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int FLING_MIN_DISTANCE = 150, FLING_MIN_VELOCITY = 220; //实现了左右滑动时activity之间的跳转 if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { Toast.makeText(this, "Left", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(); intent.setClass(MainActivity.this, NextActivity.class); startActivity(intent); } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { Toast.makeText(this, "Right", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(); intent.setClass(MainActivity.this, NextActivity.class); startActivity(intent); } return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return true; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }
看完代码的同学会发现多了一个dispatchTouchEvent函数,就是这个函数完美的解决了listview和手势识别滑动之间响应冲突的问题。
具体原因可能是dispatchTouchEvent对Touch响应时间进行了分发