1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.support.v7.widget.helper; 18 19 import android.graphics.Canvas; 20 import android.support.v4.view.ViewCompat; 21 import android.support.v7.widget.RecyclerView; 22 import android.view.View; 23 import android.support.v7.recyclerview.R; 24 25 26 /** 27 * Package private class to keep implementations. Putting them inside ItemTouchUIUtil makes them 28 * public API, which is not desired in this case. 29 */ 30 class ItemTouchUIUtilImpl { 31 static class Lollipop extends Honeycomb { 32 @Override onDraw(Canvas c, RecyclerView recyclerView, View view, float dX, float dY, int actionState, boolean isCurrentlyActive)33 public void onDraw(Canvas c, RecyclerView recyclerView, View view, 34 float dX, float dY, int actionState, boolean isCurrentlyActive) { 35 if (isCurrentlyActive) { 36 Object originalElevation = view.getTag(R.id.item_touch_helper_previous_elevation); 37 if (originalElevation == null) { 38 originalElevation = ViewCompat.getElevation(view); 39 float newElevation = 1f + findMaxElevation(recyclerView, view); 40 ViewCompat.setElevation(view, newElevation); 41 view.setTag(R.id.item_touch_helper_previous_elevation, originalElevation); 42 } 43 } 44 super.onDraw(c, recyclerView, view, dX, dY, actionState, isCurrentlyActive); 45 } 46 findMaxElevation(RecyclerView recyclerView, View itemView)47 private float findMaxElevation(RecyclerView recyclerView, View itemView) { 48 final int childCount = recyclerView.getChildCount(); 49 float max = 0; 50 for (int i = 0; i < childCount; i++) { 51 final View child = recyclerView.getChildAt(i); 52 if (child == itemView) { 53 continue; 54 } 55 final float elevation = ViewCompat.getElevation(child); 56 if (elevation > max) { 57 max = elevation; 58 } 59 } 60 return max; 61 } 62 63 @Override clearView(View view)64 public void clearView(View view) { 65 final Object tag = view.getTag(R.id.item_touch_helper_previous_elevation); 66 if (tag != null && tag instanceof Float) { 67 ViewCompat.setElevation(view, (Float) tag); 68 } 69 view.setTag(R.id.item_touch_helper_previous_elevation, null); 70 super.clearView(view); 71 } 72 } 73 74 static class Honeycomb implements ItemTouchUIUtil { 75 76 @Override clearView(View view)77 public void clearView(View view) { 78 ViewCompat.setTranslationX(view, 0f); 79 ViewCompat.setTranslationY(view, 0f); 80 } 81 82 @Override onSelected(View view)83 public void onSelected(View view) { 84 85 } 86 87 @Override onDraw(Canvas c, RecyclerView recyclerView, View view, float dX, float dY, int actionState, boolean isCurrentlyActive)88 public void onDraw(Canvas c, RecyclerView recyclerView, View view, 89 float dX, float dY, int actionState, boolean isCurrentlyActive) { 90 ViewCompat.setTranslationX(view, dX); 91 ViewCompat.setTranslationY(view, dY); 92 } 93 94 @Override onDrawOver(Canvas c, RecyclerView recyclerView, View view, float dX, float dY, int actionState, boolean isCurrentlyActive)95 public void onDrawOver(Canvas c, RecyclerView recyclerView, 96 View view, float dX, float dY, int actionState, boolean isCurrentlyActive) { 97 98 } 99 } 100 101 static class Gingerbread implements ItemTouchUIUtil { 102 draw(Canvas c, RecyclerView parent, View view, float dX, float dY)103 private void draw(Canvas c, RecyclerView parent, View view, 104 float dX, float dY) { 105 c.save(); 106 c.translate(dX, dY); 107 parent.drawChild(c, view, 0); 108 c.restore(); 109 } 110 111 @Override clearView(View view)112 public void clearView(View view) { 113 view.setVisibility(View.VISIBLE); 114 } 115 116 @Override onSelected(View view)117 public void onSelected(View view) { 118 view.setVisibility(View.INVISIBLE); 119 } 120 121 @Override onDraw(Canvas c, RecyclerView recyclerView, View view, float dX, float dY, int actionState, boolean isCurrentlyActive)122 public void onDraw(Canvas c, RecyclerView recyclerView, View view, 123 float dX, float dY, int actionState, boolean isCurrentlyActive) { 124 if (actionState != ItemTouchHelper.ACTION_STATE_DRAG) { 125 draw(c, recyclerView, view, dX, dY); 126 } 127 } 128 129 @Override onDrawOver(Canvas c, RecyclerView recyclerView, View view, float dX, float dY, int actionState, boolean isCurrentlyActive)130 public void onDrawOver(Canvas c, RecyclerView recyclerView, 131 View view, float dX, float dY, 132 int actionState, boolean isCurrentlyActive) { 133 if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { 134 draw(c, recyclerView, view, dX, dY); 135 } 136 } 137 } 138 } 139