Tweaking the apps list fast scroller.

- Making the view span the full width so that you can grab the scroller on the edge of the screen.
- Offsetting the fast-scoll popup so that you can see it as you scrub.

Change-Id: If1b1934bbeac0660d829cfc29c9e588df927c5e5
This commit is contained in:
Winson Chung
2015-03-16 12:39:05 -07:00
parent c13b994c04
commit aa2ab254ea
14 changed files with 114 additions and 30 deletions

View File

@@ -14,8 +14,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff" />
<corners android:radius="3dp" />
</shape>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/apps_list_bg_inset"
android:insetLeft="@dimen/apps_container_inset"
android:insetRight="@dimen/apps_container_inset" />

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff" />
<corners
android:bottomLeftRadius="3dp"
android:bottomRightRadius="3dp" />
</shape>

View File

@@ -18,7 +18,10 @@
android:shape="rectangle">
<solid android:color="@color/apps_view_scrollbar_thumb_color" />
<size
android:width="48dp"
android:height="48dp" />
<corners android:radius="4dp" />
android:width="64dp"
android:height="64dp" />
<corners
android:topLeftRadius="64dp"
android:topRightRadius="64dp"
android:bottomLeftRadius="64dp" />
</shape>

View File

@@ -17,5 +17,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/apps_view_scrollbar_thumb_color" />
<size android:width="4dp"/>
<size android:width="@dimen/apps_view_fast_scroll_bar_size" />
</shape>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/apps_reveal_bg_inset"
android:insetLeft="@dimen/apps_container_inset"
android:insetRight="@dimen/apps_container_inset" />

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff" />
<corners android:radius="3dp" />
</shape>

View File

@@ -18,7 +18,6 @@
android:id="@+id/apps_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:background="#22000000"
android:descendantFocusability="afterDescendants">
<include

View File

@@ -20,12 +20,13 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:elevation="15dp"
android:background="@drawable/apps_list_bg"
android:visibility="gone">
<EditText
android:id="@+id/app_search_box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/apps_container_inset"
android:layout_marginRight="@dimen/apps_container_inset"
android:padding="16dp"
android:hint="@string/apps_view_search_bar_hint"
android:maxLines="1"
@@ -46,8 +47,10 @@
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:clipToPadding="false"
android:fadeScrollbars="false"
android:scrollbars="vertical"
android:scrollbarThumbVertical="@drawable/apps_list_scrollbar_thumb"
android:focusable="true"
android:descendantFocusability="afterDescendants" />
android:descendantFocusability="afterDescendants"
android:background="@drawable/apps_list_bg" />
</LinearLayout>

View File

@@ -21,5 +21,5 @@
android:layout_gravity="center"
android:elevation="15dp"
android:visibility="invisible"
android:background="@drawable/apps_list_bg"
android:background="@drawable/apps_reveal_bg"
android:focusable="false" />

View File

@@ -13,16 +13,26 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The top and bottom paddings are defined in this container, but since we want
the list view to span the full width (for touch interception purposes), we
will bake the left/right padding into that view's background itself. -->
<com.android.launcher3.AppsContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/apps_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:paddingTop="@dimen/apps_container_inset"
android:paddingBottom="@dimen/apps_container_inset"
android:background="@drawable/apps_customize_bg"
android:descendantFocusability="afterDescendants">
<include
layout="@layout/apps_reveal_view" />
layout="@layout/apps_reveal_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<include
layout="@layout/apps_list_view" />
layout="@layout/apps_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</com.android.launcher3.AppsContainerView>

View File

@@ -48,12 +48,14 @@
<!-- Apps view -->
<dimen name="apps_container_width">0dp</dimen>
<dimen name="apps_container_inset">8dp</dimen>
<dimen name="apps_grid_view_start_margin">52dp</dimen>
<dimen name="apps_view_row_height">64dp</dimen>
<dimen name="apps_view_section_text_size">24sp</dimen>
<dimen name="apps_view_fast_scroll_gutter_size">48dp</dimen>
<dimen name="apps_view_fast_scroll_bar_size">6dp</dimen>
<dimen name="apps_view_fast_scroll_gutter_size">40dp</dimen>
<dimen name="apps_view_fast_scroll_popup_size">64dp</dimen>
<dimen name="apps_view_fast_scroll_text_size">48dp</dimen>
<dimen name="apps_view_fast_scroll_text_size">40dp</dimen>
<!-- AllApps/Customize/AppsCustomize -->
<!-- The height of the tab bar - if this changes, we should update the

View File

@@ -37,6 +37,8 @@ import java.util.List;
public class AppsContainerRecyclerView extends RecyclerView
implements RecyclerView.OnItemTouchListener {
private static final float FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR = 1.5f;
private AlphabeticalAppsList mApps;
private int mNumAppsPerRow;
@@ -130,7 +132,7 @@ public class AppsContainerRecyclerView extends RecyclerView
} else {
x = getWidth() - getPaddingRight() - getScrollBarSize() - bgBounds.width();
}
int y = mLastY - bgBounds.height() / 2;
int y = mLastY - (int) (FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR * bgBounds.height());
y = Math.max(getPaddingTop(), Math.min(y, getHeight() - getPaddingBottom() -
bgBounds.height()));
canvas.translate(x, y);

View File

@@ -39,9 +39,9 @@ import java.util.List;
/**
* The all apps list view container.
*/
public class AppsContainerView extends FrameLayout implements DragSource, View.OnTouchListener,
View.OnLongClickListener, Insettable, TextWatcher, TextView.OnEditorActionListener,
LauncherTransitionable {
public class AppsContainerView extends FrameLayout implements DragSource, Insettable, TextWatcher,
TextView.OnEditorActionListener, LauncherTransitionable, View.OnTouchListener,
View.OnLongClickListener {
private static final boolean ALLOW_SINGLE_APP_LAUNCH = true;
@@ -188,10 +188,10 @@ public class AppsContainerView extends FrameLayout implements DragSource, View.O
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN ||
event.getAction() == MotionEvent.ACTION_MOVE) {
mLastTouchDownPos.set((int) event.getX(), (int) event.getY());
public boolean onTouch(View v, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN ||
ev.getAction() == MotionEvent.ACTION_MOVE) {
mLastTouchDownPos.set((int) ev.getX(), (int) ev.getY());
}
return false;
}
@@ -333,7 +333,6 @@ public class AppsContainerView extends FrameLayout implements DragSource, View.O
List<AppInfo> appsWithoutSections = mApps.getAppsWithoutSectionBreaks();
List<AppInfo> apps = mApps.getApps();
if (appsWithoutSections.size() == 1) {
mSearchBar.clearFocus();
mAppsListView.getChildAt(apps.indexOf(appsWithoutSections.get(0))).performClick();
InputMethodManager imm = (InputMethodManager)
getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

View File

@@ -84,12 +84,13 @@ class AppsGridAdapter extends RecyclerView.Adapter<AppsGridAdapter.ViewHolder> {
mSectionTextPaint.getTextBounds(section, 0, section.length(),
mTmpBounds);
if (mIsRtl) {
c.drawText(section, parent.getWidth() - mStartMargin +
(mStartMargin - mTmpBounds.width()) / 2,
int left = parent.getWidth() - mPaddingStart - mStartMargin;
c.drawText(section, left + (mStartMargin - mTmpBounds.width()) / 2,
child.getTop() + (2 * child.getPaddingTop()) +
mTmpBounds.height(), mSectionTextPaint);
} else {
c.drawText(section, (mStartMargin - mTmpBounds.width()) / 2,
int left = mPaddingStart;
c.drawText(section, left + (mStartMargin - mTmpBounds.width()) / 2,
child.getTop() + (2 * child.getPaddingTop()) +
mTmpBounds.height(), mSectionTextPaint);
}
@@ -118,6 +119,7 @@ class AppsGridAdapter extends RecyclerView.Adapter<AppsGridAdapter.ViewHolder> {
private String mEmptySearchText;
// Section drawing
private int mPaddingStart;
private int mStartMargin;
private Paint mSectionTextPaint;
private Rect mTmpBounds = new Rect();
@@ -136,6 +138,7 @@ class AppsGridAdapter extends RecyclerView.Adapter<AppsGridAdapter.ViewHolder> {
mIconClickListener = iconClickListener;
mIconLongClickListener = iconLongClickListener;
mStartMargin = res.getDimensionPixelSize(R.dimen.apps_grid_view_start_margin);
mPaddingStart = res.getDimensionPixelSize(R.dimen.apps_container_inset);
mSectionTextPaint = new Paint();
mSectionTextPaint.setTextSize(res.getDimensionPixelSize(
R.dimen.apps_view_section_text_size));