Androidアニメーション集のフレームアニメーション

このセクションの概要:

このセクションから始めて、Android のアニメーションを見てみましょう。結局のところ、APP にいくつかのアニメーションを追加すると、アクティビティをオンまたはオフにする最も簡単な方法など、アプリケーションがより魅力的になります。もちろん、カスタム コントロール アニメーションは間違いなく不可欠です。 ~ Android のアニメーションは、フレーム単位のアニメーション (Frame)トゥイーン アニメーション (Tween) 、およびAndroid 3.0 以降に導入されたプロパティ アニメーション (Property)の 3 つのカテゴリに分かれており、このセクションでは最初のカテゴリについて説明します。 ~コマ送りアニメーションの基本的な使い方~ 


1. フレームアニメーションの概念と使い方

フレームアニメーションは非常にわかりやすいです。実際には、N枚の静止画像を集めて、制御によってこれらの画像を順番に表示しているだけです。人間の目の「視覚的な残留物」により、私たちに「錯覚」を引き起こします。アニメの「」を見てムービーを再生する 原理は同じです!

Android でフレーム アニメーションを実装するには、通常、前に説明した Drawable を使用します。AnimationDrawable は最初 に Drawable を書き込み、次にコード内で start() と stop() を呼び出してアニメーションの再生を開始または停止します。

もちろん、Java コードでフレームごとのアニメーションを作成し、AnimationDrawable オブジェクトを作成してから、addFrame(Drawable Frame, int period) を呼び出してアニメーションにフレームを追加してから、start() と stop() を呼び出すこともできます。

次のフレームのアニメーションの効果を体験し、使い方に慣れるために 2 つの例を書いてみましょう。


2. 使用例:

例 1: 最も単純な例:

ランニング効果図

コードの実装:

まずアニメーション ファイルを非常に簡単に記述します。最初に res の下に anim ディレクトリを作成し、次にアニメーション ファイルを開始します。miao_gif.xml : ここで android:oneshot は、アニメーションが 1 回だけ再生されるかどうかを設定します。true は 1 回だけ再生され、false はループします。 !

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false"> 
    <item 
        android:drawable="@mipmap/img_miao1" 
        android:duration="80" /> 
    <item 
        android:drawable="@mipmap/img_miao2" 
        android:duration="80" /> 
    <item 
        android:drawable="@ mipmap/img_miao3" 
        android:duration="80" /> 
    <!--スペースに限りがあるため、他の項目は省略し、自分で記入してください--> 
    ... 
</animation-list>

アニメーション ファイルを使用して、レイアウト ファイルactivity_main.xmlに移動します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <Button 
        android:id ="@+id/btn_start" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="开始" /> 

    <ボタン
        android:id="@+id/btn_stop" 
        android:layout_width="wrap_content " 
        android:layout_height="wrap_content"
        アンドロイド:text="停止" /> 

    <ImageView 
        android:id="@+id/img_show" 
        android:layout_width="120dp" 
        android:layout_height="120dp"
        android:layout_gravity="center" 
        android:background="@anim/miao_gif" /> 
    
</LinearLayout>

最後に、MainActivity.javaは、アニメーションの開始と一時停止を制御します。

public class MainActivity extends AppCompatActivityimplemented View.OnClickListener { 

    private Button btn_start; 
    プライベートボタン btn_stop; 
    プライベート ImageView img_show; 
    プライベートAnimationDrawableアニメーション; 

    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        バインドビュー(); 
        anim = (AnimationDrawable) img_show.getBackground(); 
    private void 

    bindingViews() { 
        btn_start = (ボタン) findViewById(R.id.btn_start); 
        btn_stop = (ボタン) findViewById(R.id.btn_stop);
        img_show = (イメージビュー) findViewById(R.id.img_show);
        btn_start.setOnClickListener(this); 
        btn_stop.setOnClickListener(this); 
    @Override 
    public void onClick(View v) { 
        switch (v.getId()) { 
    
    case 
            R.id.btn_start: 
                anim.start(); 
                壊す; 
            case R.id.btn_stop: 
                anim.stop(); 
                壊す; 
        } 
} 
    }

はい、とても簡単ですよ~


例2: 指定した場所でフレームアニメーションを再生する

ランニング効果図

コードの実装:

それでも最初にアニメーション ファイルをアップロードします: anim_zhuan.xml :

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true"> 
    <item 
        android:drawable="@mipmap/img_zhuan1" 
        android:duration=" 80" /> 
    <item 
        android:drawable="@mipmap/img_zhuan2" 
        android:duration="80" /> 
    <item 
        android:drawable="@mipmap/img_zhuan3" 
        android:duration="80" /> 
     <!--スペースの都合上、その他の項目は省略したり、自分で追加したりしています --> 
    ... 
</animation-list>

次に、カスタム ImageView: FrameView.javaを作成しましょう。ここで、現在再生されているフレームがリフレクションを通じて取得され、それが最後のフレームであるかどうかを確認し、そうである場合はコントロールを非表示にします。

/** 
 * 2015/11/15 0015 に Jay によって作成されました。
 */ 
public class FrameView extends ImageView { 

    private AnimeDrawable anim; 

    public FrameView(Context context) { 
        super(context); 
    public 

    FrameView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    public 

    FrameView(Context context, AttributeSet attrs, int defStyleAttr) { 
        super(context, attrs, defStyleAttr); 
    public 

    void setAnim(AnimationDrawable anim){ 
        this.anim = anim; 
    public void setLocation(int top,int left){ 
        this.setFrame(left,top,left + 200,top + 200) 
    ;
 
    } 

    @Override
    protected void onDraw(Canvas Canvas) { 
        try{ //Reflection は、AnimationDrawable
            フィールド
            の mCurFrame の値を呼び出しますfield = AnimationDrawable.class 
                    .getDeclaredField("mCurFrame"); 
            field.setAccessible(true); 
            int curFrame = field.getInt(anim) ; // アニメーション アニメーションの現在のフレームを取得します
            if (curFrame == anim.getNumberOfFrames() - 1)// 最後のフレームに到達した場合
            { 
                // ビューを非表示にします
                setVisibility(View.INVISIBLE); 
            } 
        }catch (例外 e) {e.printStackTrace();} 
        super.onDraw(canvas); 
    } 
}

最後に、MainActivity.javaは FrameLayout を作成し、View を追加し、タッチ イベントで押されたイベントを処理し、コントロールを表示してアニメーションを開始します~

public class MainActivity extends AppCompatActivity { 

    private FrameView fView; 
    プライベートAnimationDrawable anim = null; 

    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        FrameLayout fly = new FrameLayout(this); 
        setContentView(fly); 
        fView = 新しい FrameView(this); 
        fView.setBackgroundResource(R.anim.anim_zhuan); 
        fView.setVisibility(View.INVISIBLE); 
        anim = (AnimationDrawable) fView.getBackground(); 
        fView.setAnim(anim); 
        fly.addView(fView); 
        fly.setOnTouchListener(new View.OnTouchListener() {
            @オーバーライド
            public boolean onTouch(View v, MotionEvent event) { 
                //押されたときのみアニメーション効果を設定します
                if(event.getAction() == MotionEvent.ACTION_DOWN){ 
                    anim.stop(); 
                    float x =event.getX(); 
                    float y =event.getY(); 
                    fView.setLocation((int) y - 40,(int)x-20); //表示位置を表示
                    fView.setVisibility(View.VISIBLE); 
                    anim.start(); / /アニメーション開始
                } 
                false を返します; 
            } 
        }); 
    } 
}

おすすめ

転載: blog.csdn.net/leyang0910/article/details/131838921