Advertisement
Guest User

Multitouch container

a guest
Dec 6th, 2011
3,602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.65 KB | None | 0 0
  1. public class Container extends LinearLayout
  2. {  
  3.     LinkedHashMap<Integer,View> pointers = new LinkedHashMap<Integer,View>();
  4.     ArrayList<View> views  = new ArrayList<View>();
  5.    
  6.     public Container(Context context) {
  7.         super(context);
  8.         initialize(context);
  9.      
  10.     }
  11.  
  12.     public Container(Context context, AttributeSet attrs) {
  13.         super(context, attrs);
  14.         initialize(context);
  15.     }
  16.    
  17.     private void initialize(Context context)
  18.     {
  19.  
  20.     }
  21.     @Override
  22.     public void onLayout(boolean changed, int l, int t, int r, int b)
  23.     {
  24.         super.onLayout(changed, l, t, r, b);
  25.         views = LayoutUtil.flattenLayout(this,false);
  26.         for(View foo : views)
  27.         {
  28.             Rect rect = new Rect();
  29.             foo.getGlobalVisibleRect(rect);
  30.         }
  31.     }
  32.    
  33.     @Override
  34.     public boolean onInterceptTouchEvent(MotionEvent event)
  35.     {
  36.         return true;
  37.     }
  38.     @Override
  39.     public boolean onTouchEvent(MotionEvent event)
  40.     {
  41.         int action = event.getAction() & MotionEvent.ACTION_MASK;
  42.         if(action==MotionEvent.ACTION_DOWN)
  43.         {
  44.             for(View v: views)
  45.             {
  46.                 Rect r = new Rect();
  47.                 v.getGlobalVisibleRect(r);
  48.                 if (event.getX() > r.left && event.getX() < r.right
  49.                         && event.getY() > r.top
  50.                         && event.getY() < r.bottom) {
  51.                     pointers.put(event.getPointerId(0),v);
  52.                     pointers.get(event.getPointerId(0)).onTouchEvent(event);
  53.                     break;
  54.                 }
  55.             }
  56.         }
  57.         if(action==MotionEvent.ACTION_POINTER_DOWN)
  58.         {
  59.             int pid = event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT;
  60.             int index = event.findPointerIndex(pid);
  61.                    
  62.             for(View v: views)
  63.             {
  64.                
  65.                 Rect r = new Rect();
  66.                 v.getGlobalVisibleRect(r);
  67.                 if (event.getX(index) > r.left
  68.                         && event.getX(index) < r.right
  69.                         && event.getY(index) > r.top
  70.                         && event.getY(index) < r.bottom) {
  71.                    
  72.                    
  73.                     pointers.put(pid,v);
  74.                     MotionEvent copy = MotionEvent.obtain(event);
  75.                     copy.setAction(MotionEvent.ACTION_DOWN);
  76.                     copy.setLocation(event.getX(index), event.getY(index));
  77.                     pointers.get(pid).onTouchEvent(copy);
  78.                 }
  79.             }
  80.         }
  81.         if(action==MotionEvent.ACTION_POINTER_UP)
  82.         {
  83.             int pid = event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT;
  84.             int index = event.findPointerIndex(pid);
  85.        
  86.             if(pointers.get(pid)!=null) // If the touch was outside any view
  87.             {
  88.                 MotionEvent copy = MotionEvent.obtain(event);
  89.                 copy.setAction(MotionEvent.ACTION_UP);
  90.                 pointers.get(pid).onTouchEvent(copy);
  91.                 pointers.remove(pid);
  92.             }
  93.         }
  94.        
  95.         if(action==MotionEvent.ACTION_MOVE)
  96.         {
  97.             for(int i = 0; i<event.getPointerCount();i++)
  98.             {
  99.                 int pid = event.getPointerId(i);
  100.                 MotionEvent copy = MotionEvent.obtain(event);
  101.                 copy.setLocation(event.getX(i), event.getY(i));
  102.                
  103.                 if(pointers.get(pid)==null) continue; // If the touch was outside any view
  104.                 pointers.get(pid).onTouchEvent(copy);
  105.             }
  106.         }
  107.        
  108.         if(action==MotionEvent.ACTION_UP)
  109.         {
  110.             if(pointers.get(event.getPointerId(0))!=null)
  111.             {
  112.                 pointers.get(event.getPointerId(0)).onTouchEvent(event);
  113.                 pointers.remove(event.getPointerId(0));
  114.             }
  115.         }
  116.         return true;
  117.     }
  118.  
  119. }
  120.  
  121. // This is the LayoutUtil.flattenLayout method
  122.     public static ArrayList<View> flattenLayout(View view, boolean addViewGroups)
  123.     {
  124.         ArrayList<View> viewList = new ArrayList<View>();
  125.         if(view instanceof ViewGroup)
  126.         {
  127.             if(((ViewGroup)view).getChildCount()==0)
  128.                 viewList.add(view);
  129.             else
  130.             {
  131.                 if(addViewGroups)
  132.                 {
  133.                     viewList.add(view);
  134.                 }
  135.                 ViewGroup viewgroup = (ViewGroup) view;
  136.                 for(int i = 0; i < viewgroup.getChildCount();i++)
  137.                 {
  138.                     viewList.addAll(flattenLayout(viewgroup.getChildAt(i),false));
  139.                 }
  140.             }  
  141.         }
  142.         else if(view instanceof View)
  143.         {
  144.             viewList.add(view);
  145.         }
  146.         return viewList;
  147.     }
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement