A method needs cleanup. Removed test code and added an explanation:

        private static PathEffect createPathEffect2(float pathLength, float 
phase) {
    
            //I modified the original approach using phase, to use only 
path instead because later I want to animate also the starting point and 
phase alone is not enough for this
    
            float full = phase * pathLength;
    
            return new DashPathEffect(new float[] {full, Float.MAX_VALUE}, 
//on, off
                    0);
        }




Am Mittwoch, 16. Juli 2014 23:27:48 UTC+2 schrieb user123:
>
> I'm trying to make a path animation with DashPathEffect. Have to be able 
> to replay it multiple times, using a button. Targeting KitKat.
>
> Based on 
> http://www.curious-creature.org/2013/12/21/android-recipe-4-path-tracing/
>
> My problem is, the animation works well the first 10 times or so, then the 
> path goes crazy and it starts flickering, going in the reverse order or 
> finishes where it doesn't have to.
>
> I logged the values of the animation and the values passed to the path and 
> they look correct, no jumps or anything weird. I have no idea what is 
> causing the issues.
>
> *This is the code:*
>
>     public class Test extends View {
>     
>         private float mDrag;
>     
>         private MyPath path1;
>     
>         private int mDuration;
>     
>         //just some shape
>         private static Path makeDragPath(int radius) {
>             Path p = new Path();
>             RectF oval = new RectF(10.0f, 10.0f, radius * 2.0f, radius * 
> 2.0f);
>     
>             float cx = oval.centerX();
>             float cy = oval.centerY();
>             float rx = oval.width() / 2.0f;
>             float ry = oval.height() / 2.0f;
>     
>             final float TAN_PI_OVER_8 = 0.414213562f;
>             final float ROOT_2_OVER_2 = 0.707106781f;
>     
>             float sx = rx * TAN_PI_OVER_8;
>             float sy = ry * TAN_PI_OVER_8;
>             float mx = rx * ROOT_2_OVER_2;
>             float my = ry * ROOT_2_OVER_2;
>     
>             float L = oval.left;
>             float T = oval.top;
>             float R = oval.right;
>             float B = oval.bottom;
>     
>             p.moveTo(R, cy);
>             p.quadTo(      R, cy + sy, cx + mx, cy + my);
>             p.quadTo(cx + sx, B, cx, B);
>             p.quadTo(cx - sx,       B, cx - mx, cy + my);
>             p.quadTo(L, cy + sy, L, cy);
>             p.quadTo(      L, cy - sy, cx - mx, cy - my);
>             p.quadTo(cx - sx, T, cx, T);
>     
>     
>             return p;
>         }
>     
>     
>     
>     
>         public Test(Context context, AttributeSet attrs) {
>             super(context, attrs);
>     
>             init();
>         }
>     
>     
>     
>     
>         public static class MyPath {
>             private static final Region sRegion = new Region();
>             private static final Region sMaxClip = new Region(
>                     Integer.MIN_VALUE, Integer.MIN_VALUE,
>                     Integer.MAX_VALUE, Integer.MAX_VALUE);
>     
>             final Path path;
>             final Paint paint;
>             final float length;
>             final Rect bounds;
>     
>             MyPath(Path path, Paint paint) {
>                 this.path = path;
>                 this.paint = paint;
>     
>                 PathMeasure measure = new PathMeasure(path, false);
>                 this.length = measure.getLength();
>     
>                 sRegion.setPath(path, sMaxClip);
>                 bounds = sRegion.getBounds();
>             }
>     
>     
>         }
>     
>     
>         private static PathEffect createPathEffect2(float pathLength, 
> float phase) {
>     
>             int startOffset = 200;
>     
>             float empty = Math.min(phase * pathLength, startOffset);
>     
>             float full = phase * pathLength;
>             float rest = pathLength - empty - full;
>     
>             return new DashPathEffect(new float[] {full, Float.MAX_VALUE}, 
> //on, off
>                     0);
>         }
>     
>         ObjectAnimator current;
>     
>     
>         public void startAnim() {
>             if (current != null) {
>                 current.cancel();
>             }
>     
>             current = ObjectAnimator.ofFloat(Test.this, "drag", 0.0f, 
> 1.0f).setDuration(mDuration);
>             current.start();
>         }
>     
>         private void scalePath(Path path, float scale) {
>             Matrix scaleMatrix = new Matrix();
>             scaleMatrix.setScale(scale, scale);
>             path.transform(scaleMatrix);
>         }
>     
>         private void init() {
>     
>             Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
>             paint.setStyle(Paint.Style.STROKE);
>     
>             paint.setStrokeWidth(8.0f);
>             paint.setColor(0xffffffff);
>     
>             mDuration = 3000;
>     
>             Path p1 = makeDragPath(40);
>             scalePath(p1, 3);
>     
>             path1 = new MyPath(p1, paint);
>     
>     
>             startAnim();
>         }
>     
>         public float getDrag() {
>             return mDrag;
>         }
>     
>         public void setDrag(float drag) {
>     
>             mDrag = drag;
>     
>             path1.paint.setPathEffect(createPathEffect2(path1.length, 
> mDrag));
>     
>             invalidate();
>         }
>     
>         @Override
>         protected void onDraw(Canvas canvas) {
>             super.onDraw(canvas);
>     
>             canvas.drawColor(Color.BLACK); //doesn't help
>
>             canvas.drawPath(path1.path, path1.paint);
>         }
>     
>     }
>
>
> *In my activity:*
>
>
>     @Override
>     protected void onCreate(Bundle savedInstanceState) {
>         super.onCreate(savedInstanceState);
>         setContentView(R.layout.activity_my);
>
>         final Test test = (Test)findViewById(R.id.test);
>
>         Button button = (Button)findViewById(R.id.startTest);
>         button.setOnClickListener(new View.OnClickListener() {
>             @Override
>             public void onClick(View v) {
>                 test.startAnim();
>             }
>         });
>     }
>
>
> *xml:*
>
> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android";
>     xmlns:tools="http://schemas.android.com/tools";
>     android:layout_width="match_parent"
>     android:layout_height="match_parent"
>     android:paddingLeft="@dimen/activity_horizontal_margin"
>     android:paddingRight="@dimen/activity_horizontal_margin"
>     android:paddingTop="@dimen/activity_vertical_margin"
>     android:paddingBottom="@dimen/activity_vertical_margin"
>     tools:context=".MyActivity">
>
>
>     <Button
>         android:id="@+id/startTest"
>         android:layout_width="200dp"
>         android:layout_alignParentBottom="true"
>         android:layout_alignParentLeft="true"
>         android:layout_height="60dp" />
>
>     <com.example.ivanschuetzd.myapplication.Test
>         android:id="@+id/test"
>         android:layout_width="100dp"
>         android:layout_height="100dp"
>         android:layout_alignParentBottom="true"
>         android:layout_alignParentRight="true"
>         android:background="#000000"
>         />
>
> </RelativeLayout>
>
>
>
> Any idea? Or maybe a different approach to make this kind of animation 
> with an arbitrary path? Thanks!
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to