2016-09-30 1 views
5

J'ai créé un tracé de clip circulaire sur ma toile et j'ai une colonne de nombres qui s'anime sur le canevas, donc je vois des nombres animer dans la section écrêtée et animer. Voici le code pour clipping:Android Nougat clipPath ne fonctionne pas pendant l'animation

mClipPath.addCircle((w/2f), (h/2f), radius, Path.Direction.CW); 
canvas.clipPath(mClipPath, Region.Op.INTERSECT); 

Comme vous pouvez le voir, 0 est et 1 sur indicateur animé est en indicateur animé (les chiffres à droite). Mais dans certains cas, l'écrêtage ne se produit pas correctement pendant l'animation (3 et 4 sur la gauche).

enter image description here

Ce qui se passe uniquement sur Nougat.

+0

Pouvez-vous partager des captures d'écran des autres versions api? En outre, plus de code serait utile – Shmuel

+0

Les autres versions d'api sont similaires à la première capture d'écran, pas de découpage irrégulier pour l'un des nombres pendant l'animation. – Santoshastagi

Répondre

1

Je vois le même problème. Lors du défilement d'un RecyclerView contenant le CircleCropDrawable ci-dessous, je peux voir le flash pouvant être tiré entre clippé et non écrêté en fonction de la position de défilement.

Cependant, par essais et erreurs, j'ai vu que cela ne s'est produit que lorsque le chemin a intersecté le bord de l'emboutissable. La réduction du rayon par 1DP résout le problème (Moins de 1DP ne fonctionne pas)

CircleCropDrawable.java

package com.someone.android.view; 
 

 
import android.content.Context; 
 
import android.graphics.Canvas; 
 
import android.graphics.ColorFilter; 
 
import android.graphics.Path; 
 
import android.graphics.Rect; 
 
import android.graphics.drawable.Drawable; 
 
import android.support.annotation.NonNull; 
 
import android.util.TypedValue; 
 

 
public class CircleCropDrawable extends Drawable { 
 

 
    private final Context mContext; 
 
    private final Drawable mDrawable; 
 

 
    public CircleCropDrawable(Context context, Drawable drawable) { 
 
     mContext = context; 
 
     this.mDrawable = drawable; 
 
    } 
 

 
    @Override 
 
    public void draw(@NonNull Canvas canvas) { 
 
     final float width = getBounds().width(); 
 
     final float height = getBounds().height(); 
 
     final Path path = new Path(); 
 
     // There seems to be a bug in N where the clip path doesn't work when animating 
 
     // without a 1dp reduction in radius, the drawable unclips when scrolling in a RecyclerView 
 
     float inset = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, mContext.getResources().getDisplayMetrics()); 
 
     path.addCircle(width/2, height/2, Math.min(width/2, height/2) - inset, Path.Direction.CW); 
 
     canvas.clipPath(path); 
 
     mDrawable.draw(canvas); 
 
    } 
 

 
    @Override 
 
    protected void onBoundsChange(Rect bounds) { 
 
     mDrawable.setBounds(bounds); 
 
    } 
 

 
    @Override 
 
    public int getIntrinsicWidth() { 
 
     return mDrawable.getIntrinsicWidth(); 
 
    } 
 

 
    @Override 
 
    public int getIntrinsicHeight() { 
 
     return mDrawable.getIntrinsicHeight(); 
 
    } 
 

 

 
    @Override 
 
    public void setAlpha(int i) { 
 
     mDrawable.setAlpha(i); 
 
    } 
 

 
    @Override 
 
    public void setColorFilter(ColorFilter colorFilter) { 
 
     mDrawable.setColorFilter(colorFilter); 
 
    } 
 

 
    @Override 
 
    public int getOpacity() { 
 
     return mDrawable.getOpacity(); 
 
    } 
 
}

+0

Incroyable! J'ai passé beaucoup de temps avec le même problème. Je ne peux pas comprendre ça! :-) Je vous remercie. –

0

Nous avons corrigé le problème en désactivant l'accélération matérielle à ce point de vue, comme ceci:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);