/** * Tint the edge effect when you reach the end of a scroll view. API 21+ only * * @param scrollableView the scrollable view, such as a {@link android.widget.ScrollView} * @param color the color * @return true if it worked, false if it did not */ @TargetApi(21) public static boolean tintEdgeEffect(@NonNull View scrollableView, @ColorInt int color) { //http://stackoverflow.com/questions/27104521/android-lollipop-scrollview-edge-effect-color boolean outcome = false; final String[] edgeGlows = {"mEdgeGlowTop", "mEdgeGlowBottom", "mEdgeGlowLeft", "mEdgeGlowRight"}; for (String edgeGlow : edgeGlows) { Class<?> clazz = scrollableView.getClass(); while (clazz != null) { try { final Field edgeGlowField = clazz.getDeclaredField(edgeGlow); edgeGlowField.setAccessible(true); final EdgeEffect edgeEffect = (EdgeEffect) edgeGlowField.get(scrollableView); edgeEffect.setColor(color); outcome = true; break; } catch (Exception e) { clazz = clazz.getSuperclass(); } } } return outcome; }
public HorizontalListView(Context context, AttributeSet attrs) { super(context, attrs); mEdgeGlowLeft = new EdgeEffect(context); mEdgeGlowRight = new EdgeEffect(context); mGestureDetector = new GestureDetector(context, mGestureListener); bindGestureDetector(); initView(); retrieveXmlConfiguration(context, attrs); setWillNotDraw(false); // If the OS version is high enough then set the friction on the fling // tracker */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { HoneycombPlus.setFriction(mFlingTracker, FLING_FRICTION); } ViewConfiguration vc = ViewConfiguration.get(context); mSlop = vc.getScaledTouchSlop(); }
public static void setListViewEdgeEffectColor(AbsListView listView, int color) { if (Build.VERSION.SDK_INT >= 21) { try { Field field = AbsListView.class.getDeclaredField("mEdgeGlowTop"); field.setAccessible(true); EdgeEffect mEdgeGlowTop = (EdgeEffect) field.get(listView); if (mEdgeGlowTop != null) { mEdgeGlowTop.setColor(color); } field = AbsListView.class.getDeclaredField("mEdgeGlowBottom"); field.setAccessible(true); EdgeEffect mEdgeGlowBottom = (EdgeEffect) field.get(listView); if (mEdgeGlowBottom != null) { mEdgeGlowBottom.setColor(color); } } catch (Exception e) { FileLog.e("tmessages", e); } } }
public static void setListViewEdgeEffectColor(AbsListView listView, int color) { if (Build.VERSION.SDK_INT >= 21) { try { Field field = AbsListView.class.getDeclaredField("mEdgeGlowTop"); field.setAccessible(true); EdgeEffect mEdgeGlowTop = (EdgeEffect) field.get(listView); if (mEdgeGlowTop != null) { mEdgeGlowTop.setColor(color); } field = AbsListView.class.getDeclaredField("mEdgeGlowBottom"); field.setAccessible(true); EdgeEffect mEdgeGlowBottom = (EdgeEffect) field.get(listView); if (mEdgeGlowBottom != null) { mEdgeGlowBottom.setColor(color); } } catch (Exception e) { e.printStackTrace(); } } }
/** * Constructor * * @param context The context * @param attrs The attrs * @param defStyleAttr The default attr */ public FmScroller(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); final ViewConfiguration configuration = ViewConfiguration.get(context); setFocusable(false); // Drawing must be enabled in order to support EdgeEffect setWillNotDraw(/* willNotDraw = */false); mEdgeGlowBottom = new EdgeEffect(context); mScroller = new Scroller(context, INTERPOLATOR); mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); final TypedArray attributeArray = context.obtainStyledAttributes(new int[] { android.R.attr.actionBarSize }); mActionBarSize = attributeArray.getDimensionPixelSize(0, 0); attributeArray.recycle(); }
public static void setEdgeEffectColor(EdgeEffect edgeEffect, int color) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { edgeEffect.setColor(color); return; } Field edgeField = EdgeEffect.class.getDeclaredField("mEdge"); Field glowField = EdgeEffect.class.getDeclaredField("mGlow"); edgeField.setAccessible(true); glowField.setAccessible(true); Drawable mEdge = (Drawable) edgeField.get(edgeEffect); Drawable mGlow = (Drawable) glowField.get(edgeEffect); mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN); mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN); mEdge.setCallback(null); // free up any references mGlow.setCallback(null); // free up any references } catch (Exception ignored) { } }
public PhotoViewPager(Context context, Adapter adapter) { super(context); setWillNotDraw(false); float density = ResourceUtils.obtainDensity(context); flingDistance = (int) (24 * density); ViewConfiguration configuration = ViewConfiguration.get(context); minimumVelocity = (int) (MIN_FLING_VELOCITY * density); maximumVelocity = configuration.getScaledMaximumFlingVelocity(); touchSlop = configuration.getScaledTouchSlop(); scroller = new OverScroller(context); edgeEffect = new EdgeEffect(context); this.adapter = adapter; for (int i = 0; i < 3; i++) { View view = adapter.onCreateView(this); super.addView(view, -1, generateDefaultLayoutParams()); photoViews.add(adapter.getPhotoView(view)); } }
/** * Controls whether the edge glows are enabled or not */ public void setEdgeEffectsEnabled(boolean val) { mEdgeEffectsEnabled = val; if (val) { Context context = getContext(); setWillNotDraw(false); mLeftEdge = new EdgeEffect(context); mRightEdge = new EdgeEffect(context); mTopEdge = new EdgeEffect(context); mBottomEdge = new EdgeEffect(context); } else { setWillNotDraw(true); mLeftEdge = mRightEdge = mTopEdge = mBottomEdge = null; } }
void applyEdgeEffectColor(EdgeEffectCompat edgeEffectCompat) { if (Build.VERSION.SDK_INT >= 21 && glowColor != 0) { try { Field field = EdgeEffectCompat.class.getDeclaredField("mEdgeEffect"); field.setAccessible(true); EdgeEffect edgeEffect = (EdgeEffect) field.get(edgeEffectCompat); if (edgeEffect != null) { edgeEffect.setColor(glowColor); } } catch (Exception e) { FileLog.e("tmessages", e); } } }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void setEdgeGlowColor(Object edgeEffect, @ColorInt int color) { if (edgeEffect instanceof EdgeEffectCompat) { // EdgeEffectCompat try { edgeEffect = EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT.get(edgeEffect); } catch (IllegalAccessException e) { if (BuildConfig.DEBUG) e.printStackTrace(); return; } } if (edgeEffect == null) return; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // EdgeGlow below Android 4 then old EdgeEffect try { final Drawable mEdge = (Drawable) EDGE_GLOW_FIELD_EDGE.get(edgeEffect); final Drawable mGlow = (Drawable) EDGE_GLOW_FIELD_GLOW.get(edgeEffect); mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN); mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN); mEdge.setCallback(null); // free up any references mGlow.setCallback(null); // free up any references } catch (Exception ex) { if (BuildConfig.DEBUG) ex.printStackTrace(); } } else { // EdgeEffect ((EdgeEffect) edgeEffect).setColor(color); } }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void setEffectColor(Object edgeEffect, @ColorInt int color) { invalidateEdgeEffectFields(); if (edgeEffect instanceof EdgeEffectCompat) { // EdgeEffectCompat try { EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT.setAccessible(true); edgeEffect = EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT.get(edgeEffect); } catch (IllegalAccessException e) { e.printStackTrace(); return; } } if (edgeEffect == null) return; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // EdgeGlow try { EDGE_GLOW_FIELD_EDGE.setAccessible(true); final Drawable mEdge = (Drawable) EDGE_GLOW_FIELD_EDGE.get(edgeEffect); EDGE_GLOW_FIELD_GLOW.setAccessible(true); final Drawable mGlow = (Drawable) EDGE_GLOW_FIELD_GLOW.get(edgeEffect); mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN); mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN); mEdge.setCallback(null); // free up any references mGlow.setCallback(null); // free up any references } catch (Exception ex) { ex.printStackTrace(); } } else { // EdgeEffect ((EdgeEffect) edgeEffect).setColor(color); } }
protected void setupEdgeEffect(Context context) { // Sets up edge effects mEdgeEffectLeft = new EdgeEffect(context); mEdgeEffectTop = new EdgeEffect(context); mEdgeEffectRight = new EdgeEffect(context); mEdgeEffectBottom = new EdgeEffect(context); }
private void init() { ViewConfiguration configuration = ViewConfiguration.get(getContext()); mScroller = new Scroller(getContext(), new LinearInterpolator()); mTouchSlop = configuration.getScaledPagingTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mLeftEdgeEffect = new EdgeEffect(getContext()); mRightEdgeEffect = new EdgeEffect(getContext()); mShadePaint.setColor(Color.BLACK); mShinePaint.setColor(Color.WHITE); }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void setEdgeGlowColor(@NonNull EdgeEffectCompat edgeEffect, @ColorInt int color) throws Exception { Field field = EdgeEffectCompat.class.getDeclaredField("mEdgeEffect"); field.setAccessible(true); EdgeEffect effect = (EdgeEffect) field.get(edgeEffect); if (effect != null) effect.setColor(color); }
public static void setEdgeGlowColor(AbsListView listView, int color) { try { Class<?> clazz = AbsListView.class; Field fEdgeGlowTop = clazz.getDeclaredField("mEdgeGlowTop"); Field fEdgeGlowBottom = clazz.getDeclaredField("mEdgeGlowBottom"); fEdgeGlowTop.setAccessible(true); fEdgeGlowBottom.setAccessible(true); setEdgeEffectColor((EdgeEffect) fEdgeGlowTop.get(listView), color); setEdgeEffectColor((EdgeEffect) fEdgeGlowBottom.get(listView), color); } catch (Throwable ignored) { } }
private void drawEdgeEffect(Canvas canvas, EdgeEffect edgeEffect, int degrees) { if (canvas == null || edgeEffect == null || (degrees != 90 && degrees != 270)) { return; } if(!edgeEffect.isFinished()) { final int restoreCount = canvas.getSaveCount(); final int width = getWidth(); final int height = getHeight(); canvas.rotate(degrees); if (degrees == 270) { canvas.translate(-height, Math.max(0, getScrollX())); } else { // 90 canvas.translate(0, -(Math.max(getScrollRange(), getScaleX()) + width)); } edgeEffect.setSize(height, width); if(edgeEffect.draw(canvas)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { postInvalidateOnAnimation(); } else { postInvalidate(); } } canvas.restoreToCount(restoreCount); } }
@Override public void setOverScrollMode(int overScrollMode) { if(overScrollMode != OVER_SCROLL_NEVER) { Context context = getContext(); leftEdgeEffect = new EdgeEffect(context); rightEdgeEffect = new EdgeEffect(context); } else { leftEdgeEffect = null; rightEdgeEffect = null; } super.setOverScrollMode(overScrollMode); }
void initViewPager() { setWillNotDraw( false ); setDescendantFocusability( FOCUS_AFTER_DESCENDANTS ); setFocusable( true ); final Context context = getContext(); mScroller = new Scroller( context, sInterpolator ); final ViewConfiguration configuration = ViewConfiguration.get( context ); final float density = context.getResources().getDisplayMetrics().density; mTouchSlop = configuration.getScaledPagingTouchSlop(); mMinimumVelocity = (int) ( MIN_FLING_VELOCITY * density ); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mLeftEdge = new EdgeEffect( context ); mRightEdge = new EdgeEffect( context ); mFlingDistance = (int) ( MIN_DISTANCE_FOR_FLING * density ); mCloseEnough = (int) ( CLOSE_ENOUGH * density ); mDefaultGutterSize = (int) ( DEFAULT_GUTTER_SIZE * density ); setAccessibilityDelegate( new MyAccessibilityDelegate() ); if ( this.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO ) { setImportantForAccessibility( View.IMPORTANT_FOR_ACCESSIBILITY_YES ); } }
void initViewPager() { setWillNotDraw(false); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setFocusable(true); final Context context = getContext(); mScroller = new Scroller(context, sInterpolator); final ViewConfiguration configuration = ViewConfiguration.get(context); final float density = context.getResources().getDisplayMetrics().density; mTouchSlop = configuration.getScaledPagingTouchSlop(); mMinimumVelocity = (int) (MIN_FLING_VELOCITY * density); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mTopEdge = new EdgeEffect(context); mBottomEdge = new EdgeEffect(context); mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density); mCloseEnough = (int) (CLOSE_ENOUGH * density); mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density); ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate()); if (ViewCompat.getImportantForAccessibility(this) == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES); } }
private EdgeEffect getEdgeForAxisAndSide(final Axis axis, final float side) { if (axis == Axis.Y) { if (side < 0) { return mEdges[TOP]; } else { return mEdges[BOTTOM]; } } else { if (side < 0) { return mEdges[LEFT]; } else { return mEdges[RIGHT]; } } }
@Override public void setVelocity(final float velocity, final Axis axis) { final EdgeEffect edge = getEdgeForAxisAndSide(axis, velocity); // If we're showing overscroll already, start fading it out. if (!edge.isFinished()) { edge.onRelease(); } else { // Otherwise, show an absorb effect edge.onAbsorb((int)velocity); } invalidate(); }
@Override public void setDistance(final float distance, final Axis axis) { // The first overscroll event often has zero distance. Throw it out if (distance == 0.0f) { return; } final EdgeEffect edge = getEdgeForAxisAndSide(axis, (int)distance); edge.onPull(distance / (axis == Axis.X ? mView.getWidth() : mView.getHeight())); invalidate(); }
private static boolean draw(final EdgeEffect edge, final Canvas canvas, final float translateX, final float translateY, final float rotation) { final int state = canvas.save(); canvas.translate(translateX, translateY); canvas.rotate(rotation); boolean invalidate = edge.draw(canvas); canvas.restoreToCount(state); return invalidate; }
@SuppressLint("NewApi") public static void changeEdgeEffect(Context cxt, View list, int glowColor, int lineColor) { if (Helper.isAtLeastAPI(Build.VERSION_CODES.LOLLIPOP)) { EdgeEffect edgeEffectTop = new EdgeEffect(cxt); edgeEffectTop.setColor(glowColor); EdgeEffect edgeEffectBottom = new EdgeEffect(cxt); edgeEffectBottom.setColor(glowColor); try { Field f1 = AbsListView.class.getDeclaredField("mEdgeGlowTop"); f1.setAccessible(true); f1.set(list, edgeEffectTop); Field f2 = AbsListView.class.getDeclaredField("mEdgeGlowBottom"); f2.setAccessible(true); f2.set(list, edgeEffectBottom); } catch (Exception e) { e.printStackTrace(); } } else { // Android < 5.0 - OverScroll Glow int glowDrawableId = cxt.getResources().getIdentifier("overscroll_glow", "drawable", "android"); Drawable androidGlow = ContextCompat.getDrawable(cxt, glowDrawableId); androidGlow.setColorFilter(ContextCompat.getColor(cxt, glowColor), PorterDuff.Mode.SRC_ATOP); // Android < 5.0 - OverScroll Edge Line final int edgeDrawableId = cxt.getResources().getIdentifier("overscroll_edge", "drawable", "android"); final Drawable overScrollEdge = ContextCompat.getDrawable(cxt, edgeDrawableId); overScrollEdge.setColorFilter(ContextCompat.getColor(cxt, lineColor), PorterDuff.Mode.SRC_ATOP); } }
public StaggeredGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StaggeredGridView, defStyle, 0); colCount = a.getInt(R.styleable.StaggeredGridView_android_numColumns, 1); verticalItemMargin = a.getDimensionPixelSize(R.styleable.StaggeredGridView_verticalItemMargin, 0); horizontalItemMargin = a.getDimensionPixelSize(R.styleable.StaggeredGridView_horizontalItemMargin, 0); selector = a.getDrawable(R.styleable.StaggeredGridView_android_listChoiceBackgroundIndicator); if (selector != null) { selector.setCallback(this); } a.recycle(); final ViewConfiguration vc = ViewConfiguration.get(context); touchSlop = vc.getScaledTouchSlop(); maximumVelocity = vc.getScaledMaximumFlingVelocity(); flingVelocity = vc.getScaledMinimumFlingVelocity(); scroller = new Scroller(context); topEdge = new EdgeEffect(context); bottomEdge = new EdgeEffect(context); setWillNotDraw(false); setClipToPadding(false); setVerticalScrollBarEnabled(true); }
@Override public void computeScroll() { if (scroller.computeScrollOffset()) { final int y = scroller.getCurrY(); final int dy = (int) (y - lastTouchY); lastTouchY = y; final boolean stopped = !trackMotionScroll(dy, false); if (!stopped && !scroller.isFinished()) { postInvalidateOnAnimation(); } else { if (stopped) { final int overScrollMode = getOverScrollMode(); if (overScrollMode != OVER_SCROLL_NEVER) { final EdgeEffect edge; if (dy > 0) { edge = topEdge; } else { edge = bottomEdge; } edge.onAbsorb(Math.abs((int) scroller.getCurrVelocity())); postInvalidateOnAnimation(); } scroller.abortAnimation(); } touchMode = TOUCH_MODE_IDLE; } } }
public PanView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // Sets up interactions mGestureDetector = new GestureDetector(context, new ScrollFlingGestureListener()); mScroller = new OverScroller(context); mEdgeEffectLeft = new EdgeEffect(context); mEdgeEffectTop = new EdgeEffect(context); mEdgeEffectRight = new EdgeEffect(context); mEdgeEffectBottom = new EdgeEffect(context); mDrawBlurredPaint = new Paint(); mDrawBlurredPaint.setDither(true); }
public OverScrollGlow(View host) { mHostView = host; Context context = host.getContext(); mEdgeGlowTop = new EdgeEffect(context); mEdgeGlowBottom = new EdgeEffect(context); mEdgeGlowLeft = new EdgeEffect(context); mEdgeGlowRight = new EdgeEffect(context); }