Android animation icon -- I am not a gif maker, I am a developer, androiddeveloper

Source: Internet
Author: User

Android animation icon -- I am not a gif maker, I am a developer, androiddeveloper

We first found a cool animated icon on git:

Https://github.com/xuyisheng/tickplusdrawable


I have to say that foreign programmers are indeed much better than us in terms of details. OK. Today we will imitate this:

Now let's take a look at our results. Don't spray me, just write it for an hour. A lot of details have not been fully considered, and the code has not yet been restructured. I hope you can put forward your suggestions for modification. thx ~


The gif effect is not necessarily good. You can refer to the gif on github.




The Code is as follows:


First, we need to understand the principle:


1. First, let's determine the coordinates of some key points, that is, all the vertices of the graph we want to display.

2. We use property animation to control the moving Effect of lines. If you are not familiar with it, you can see the effect.

3. for properties that do not provide the get and set methods, we can rewrite the Property to help add the get and set methods for this Property.


After learning about the above content, you can see the specific code:

package com.example.yishengxu.canvas;import android.animation.ObjectAnimator;import android.animation.TypeEvaluator;import android.animation.ValueAnimator;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PointF;import android.util.AttributeSet;import android.util.Property;import android.view.MotionEvent;import android.view.View;import java.util.ArrayList;import java.util.List;/** * Created by yisheng.xu on 10/30/14. */public class CanvasView extends View {    private float mPaddingW;    private float mPaddingH;    private float mRotation;    private List<PointF> mAllPoints = new ArrayList<PointF>();    private PointF mPoint0;    private PointF mPoint1;    private PointF mPoint2;    private PointF mPoint3;    private PointF mPoint4;    private PointF mPoint5;    private PointF mPoint6;    private PointF mPoint7;    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);    private int touchFlag = 0;    public CanvasView(Context context) {        super(context);    }    public CanvasView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public CanvasView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        mPaddingW = w / 4;        mPaddingH = h / 4;        mAllPoints.add(new PointF(mPaddingW, mPaddingH));        mAllPoints.add(new PointF(mPaddingW * 3, mPaddingH));        mAllPoints.add(new PointF(mPaddingW, mPaddingH * 2));        mAllPoints.add(new PointF(mPaddingW * 3, mPaddingH * 2));        mAllPoints.add(new PointF(mPaddingW, mPaddingH * 3));        mAllPoints.add(new PointF(mPaddingW * 3, mPaddingH * 3));        mAllPoints.add(new PointF(mPaddingW * 2, mPaddingH));        mAllPoints.add(new PointF(mPaddingW * 2, mPaddingH * 3));        initPoints();        mPaint.setColor(Color.BLUE);        mPaint.setStrokeWidth(20);        mPaint.setStrokeCap(Paint.Cap.ROUND);        super.onSizeChanged(w, h, oldw, oldh);    }    private void initPoints() {        mPoint0 = new PointF(mAllPoints.get(0).x, mAllPoints.get(0).y);        mPoint1 = new PointF(mAllPoints.get(1).x, mAllPoints.get(1).y);        mPoint2 = new PointF(mAllPoints.get(2).x, mAllPoints.get(2).y);        mPoint3 = new PointF(mAllPoints.get(3).x, mAllPoints.get(3).y);        mPoint4 = new PointF(mAllPoints.get(4).x, mAllPoints.get(4).y);        mPoint5 = new PointF(mAllPoints.get(5).x, mAllPoints.get(5).y);        mPoint6 = new PointF();        mPoint7 = new PointF();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.save();        canvas.rotate(180 * mRotation, mPaddingW * 2, mPaddingH * 2);        drawLine(canvas, mPoint0, mPoint1);        drawLine(canvas, mPoint2, mPoint3);        drawLine(canvas, mPoint4, mPoint5);        drawLine(canvas, mPoint6, mPoint7);        canvas.restore();    }    private void drawLine(Canvas canvas,PointF start,PointF end) {        if (start.x!=0 && end.x !=0) {            canvas.drawLine(start.x, start.y, end.x, end.y, mPaint);        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (touchFlag == 0) {            animPoints(mPoint0, mAllPoints.get(2));            animPoints(mPoint4, mAllPoints.get(2));            animPoints(mPoint1, mAllPoints.get(6));            animPoints(mPoint5, mAllPoints.get(7));            touchFlag += 1;        }else if (touchFlag == 1) {            resetPoints();            touchFlag += 1;        }else if (touchFlag == 2) {            animPoints(mPoint0, mAllPoints.get(4));            animPoints(mPoint4, mAllPoints.get(0));            mPoint2 = new PointF(0, 0);            mPoint3 = new PointF(0, 0);            invalidate();            touchFlag += 1;        } else if (touchFlag == 3) {            resetPoints();            touchFlag += 1;        } else {            animPoints(mPoint0, mAllPoints.get(6));            animPoints(mPoint1, mAllPoints.get(3));            animPoints(mPoint5, mAllPoints.get(6));            mPoint2 = new PointF(0, 0);            mPoint3 = new PointF(0, 0);            invalidate();            touchFlag = 1;        }        return super.onTouchEvent(event);    }    private void resetPoints() {        animPoints(mPoint0, mAllPoints.get(0));        animPoints(mPoint1, mAllPoints.get(1));        animPoints(mPoint2, mAllPoints.get(2));        animPoints(mPoint3, mAllPoints.get(3));        animPoints(mPoint4, mAllPoints.get(4));        animPoints(mPoint5, mAllPoints.get(5));    }    private void animPoints(final PointF start, final PointF end) {        ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator<PointF>() {            @Override            public PointF evaluate(float v, PointF o, PointF o2) {                start.x = start.x + (end.x - start.x) * v;                start.y = start.y + (end.y - start.y) * v;                invalidate();                return null;            }        }, start, end);        animator.setDuration(1000);        animator.start();        ObjectAnimator animator1 = ObjectAnimator.ofFloat(this, mRotationProperty, 0, 1F);        animator1.setDuration(500);        animator1.start();    }    private Property<CanvasView, Float> mRotationProperty = new Property<CanvasView, Float>(Float.class, "rotation") {        @Override        public Float get(CanvasView object) {            return object.mRotation;        }        @Override        public void set(CanvasView object, Float value) {            object.mRotation = value;        }    };}

Layout files and main files are simple:

<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="50dp"    android:paddingRight="50dp"    android:paddingTop="150dp"    android:paddingBottom="150dp"    tools:context=".MainActivity">    <view        android:layout_width="wrap_content"        android:layout_height="wrap_content"        class="com.example.yishengxu.canvas.CanvasView"        android:id="@+id/view"        android:layout_alignParentStart="true" /></RelativeLayout>

package com.example.yishengxu.canvas;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

OK, the key is to have a brain and idea to process and create on the basis of existing knowledge.

Now, we have added Vector Drawable and support for SVG. This gives us a more powerful tool for implementing more complex path animation effects.


Finally, make an advertisement-link to HZTalk ~ Very good. Technology, movies, and games are really independent, non-objective, and third-party.


Above.




I Am The Sexy Girl-A Gun space background music link, A usable

Hello, the quality link has been sent.
The small hi icon in the upper-right corner of the page,
When a number prompt is displayed,
Click the icon to obtain my link.
Yes. Please select a satisfactory answer.
The team is inseparable from everyone's praise.
Please refer to the following link for more information:
For other friends who want to connect, click "friend for help" under my profile picture, and keep the song name + artist + email + "Hai Zhiyin]

I Am The Sexy Girl-A Gun space song link

I Am The Sexy Girl-A Gun
Dear user, the song link has already been Baidu Hi. Please pay attention to the prompt on the Hi icon in the upper right corner. If you have any questions, please contact us,
If you do not receive the email, please leave a contact email to send you a song link. If you are satisfied, please accept the answer. Thank you.
 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.