Ignore clicks on shortcuts' drag handles.

When touching down within the drag handle's bounds, we remove the
onClickListener temporarily (restored when touching down outside
of the drag handle's bounds). Long clicks still start the drag.

Also increased drag threshold from 12dp to 16dp.

Bug: 30816665

Change-Id: I0b33dc34bf95c0532376f2f7cf50865fa50093de
This commit is contained in:
Tony Wickham
2016-08-09 16:27:57 -07:00
parent 37aba27bbc
commit e04a07f6ac
2 changed files with 38 additions and 1 deletions

View File

@@ -161,7 +161,7 @@
<dimen name="deep_shortcuts_spacing">4dp</dimen>
<dimen name="deep_shortcuts_drag_view_scale">6dp</dimen>
<!-- an icon with shortcuts must be dragged this far before the container is removed. -->
<dimen name="deep_shortcuts_start_drag_threshold">12dp</dimen>
<dimen name="deep_shortcuts_start_drag_threshold">16dp</dimen>
<dimen name="deep_shortcut_icon_size">36dp</dimen>
<dimen name="deep_shortcut_padding_start">6dp</dimen>
<dimen name="deep_shortcut_padding_end">16dp</dimen>

View File

@@ -17,15 +17,23 @@
package com.android.launcher3.shortcuts;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
/**
* A {@link BubbleTextView} that has the shortcut icon on the left and drag handle on the right.
*/
public class DeepShortcutTextView extends BubbleTextView {
private final Rect mDragHandleBounds = new Rect();
private final int mDragHandleWidth;
private boolean mShouldPerformClick = true;
public DeepShortcutTextView(Context context) {
this(context, null, 0);
@@ -37,10 +45,39 @@ public class DeepShortcutTextView extends BubbleTextView {
public DeepShortcutTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
Resources resources = getResources();
mDragHandleWidth = resources.getDimensionPixelSize(R.dimen.deep_shortcut_padding_end)
+ resources.getDimensionPixelSize(R.dimen.deep_shortcut_drag_handle_size)
+ resources.getDimensionPixelSize(R.dimen.deep_shortcut_drawable_padding) / 2;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mDragHandleBounds.set(0, 0, mDragHandleWidth, getMeasuredHeight());
if (!Utilities.isRtl(getResources())) {
mDragHandleBounds.offset(getMeasuredWidth() - mDragHandleBounds.width(), 0);
}
}
@Override
protected void applyCompoundDrawables(Drawable icon) {
// The icon is drawn in a separate view.
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// Ignore clicks on the drag handle (long clicks still start the drag).
mShouldPerformClick = !mDragHandleBounds.contains((int) ev.getX(), (int) ev.getY());
}
return super.onTouchEvent(ev);
}
@Override
public boolean performClick() {
return mShouldPerformClick && super.performClick();
}
}