DragLayer.java revision 1b607ed454ed22c2fd855cb3e428376520fb2388
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2; 1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 19d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohenimport com.android.launcher.R; 20d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 2131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context; 22120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport android.graphics.Bitmap; 2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.AttributeSet; 2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.KeyEvent; 250e26059548e429e5d1c973bebe4c561bead2926fMichael Jurkaimport android.view.MotionEvent; 26ea3763c2672f77539538af8cdd395ad97058eaabRomain Guyimport android.view.View; 2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.FrameLayout; 28120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport android.widget.ImageView; 2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 310e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka * A ViewGroup that coordinates dragging across its descendants 3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 3300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopublic class DragLayer extends FrameLayout { 34120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen private DragController mDragController; 35120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen private int[] mTmpXY = new int[2]; 3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Used to create a new DragLayer from XML. 3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param context The application's context. 410e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka * @param attrs The attributes set containing the Workspace's customization values. 4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public DragLayer(Context context, AttributeSet attrs) { 4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super(context, attrs); 45be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung 46be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung // Disable multitouch across the workspace/all apps/customize tray 47be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung setMotionEventSplittingEnabled(false); 4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 5000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void setDragController(DragController controller) { 5100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mDragController = controller; 5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 5300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); 5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onInterceptTouchEvent(MotionEvent ev) { 611b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen // If the current CellLayoutChildren has a resize frame, we need to detect if any touch 621b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen // event has occurred which doesn't result in resizing a widget. In this case, we 631b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen // dismiss any visible resize frames. 641b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen final Workspace w = (Workspace) findViewById(R.id.workspace); 651b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen final CellLayout currentPage = (CellLayout) w.getChildAt(w.getCurrentPage()); 661b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen 671b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen if (currentPage.getChildrenLayout().hasResizeFrames()) { 681b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen post(new Runnable() { 691b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen public void run() { 701b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen if (!currentPage.getChildrenLayout().isWidgetBeingResized()) { 711b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen currentPage.getChildrenLayout().clearAllResizeFrames(); 721b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen } 731b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen } 741b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen }); 751b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen } 764db52312c10e822162a21c60404f06f6e507f0d6Joe Onorato return mDragController.onInterceptTouchEvent(ev); 7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onTouchEvent(MotionEvent ev) { 814db52312c10e822162a21c60404f06f6e507f0d6Joe Onorato return mDragController.onTouchEvent(ev); 8291a9c9636f10f1e12cd1f660b2e330634fbdc7dcRomain Guy } 83ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy 84ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy @Override 85ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy public boolean dispatchUnhandledMove(View focused, int direction) { 86ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy return mDragController.dispatchUnhandledMove(focused, direction); 87ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy } 88120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen 89120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen public View createDragView(Bitmap b, int xPos, int yPos) { 90120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen ImageView imageView = new ImageView(mContext); 91120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen imageView.setImageBitmap(b); 92120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen imageView.setX(xPos); 93120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen imageView.setY(yPos); 94120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen addView(imageView, b.getWidth(), b.getHeight()); 95120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen 96120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen return imageView; 97120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen } 98120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen 99120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen public View createDragView(View v) { 100120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen v.getLocationOnScreen(mTmpXY); 101120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen return createDragView(mDragController.getViewBitmap(v), mTmpXY[0], mTmpXY[1]); 102120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen } 10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 104