کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش متحرک سازی animation در اندروید

 

clip_image001

دوره آموزش برنامه نویسی اندروید

کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.

 

آموزش متحرک سازی animation در اندروید


در این فصل از سری مقاله های آموزشی با نحوه ی بهره گیری از پویانمایی یا متحرک سازی (animation) در اندروید آشنا می شوید. مبحث پیش رو بر اساس Eclipse 4.2، Java 1.6 و Android 4.2 نوشته شده است.

فهرست محتوا

1. متحرک سازی در اندروید

بررسی اجمالی

کلاس ارشد / والد Animator و کلاس     AnimatorListener

دسترسی سهل به انیمیشن های معمول با استفاده از کلاس ViewPropertyAnimator

animation layout

استفاده از قابلیت متحرک سازی در انتقال (transition) بین activity ها

2. آموزش view animation

3. بکارگیری قابلیت متحرک سازی بین تراکنش های fragment ها

4. Properties Animation API (رابط برنامه سازی کاربردی پویا نمایی خصوصیات) برای ویرایش های قدیمی تر اندروید

1. پویانمایی در اندروید

بررسی اجمالی

این ویرایش 3.0 اندروید بود که برای اولین بار این قابلیت را رونمایی و در سیستم اندروید کاربردی کرد. امکان پویانمایی در اندروید به شما اجازه می دهد خصوصیات اشیإ (object properties) را طی فاصله ی زمانی مشخص و از پیش تعریف شده تغییر دهید.

رابط برنامه سازی کاربردی (API) مذکور به برنامه نویس این امکان را می دهد که برای خصوصیات اشیإ دلخواه یک مقدار آغاز (start value) و یک مقدار پایان (end value) تعریف کرده، همچنین تغییرات زمان بندی شده (مبتنی بر زمان از پیش تعیین شده) به این خصیصه (attribute) اعمال کند. این API را می توان برای هر شی جاوایی مورد استفاده قرار داد (اعمال کرد) و نه تنها ویژه ی View ها.  

کلاس ارشد / والد Animator و کلاس     AnimatorListener

کلاس والد (superclass) رابط برنامه سازی کاربردی متحرک سازی (Animation API) کلاس Animator می باشد. معمولاً از کلاس ObjectAnimator جهت تعریف (modify) خصیصه های یک شی بکار می رود.

همچنین این امکان برای شما (برنامه نویس) فراهم شده که یک کلاس AnimatorListener به کلاس ارشد یا پدر Animator خود اضافه کنید. گوش فراخوان (listener) مزبور در مراحل مختلف متحرک سازی (animation) فراخوانی می شود.

 برنامه نویس قادر است با استفاده از گوش فراخوان ذکر شده عملیات لازم را پیش و پس از متحرک سازی (animation مورد نظر) انجام دهد، به عنوان مثال یک view را از یک viewgroup حذف یا به آن اضافه کند.   

 دسترسی سهل به انیمیشن های معمول به وسیله ی از کلاس ViewPropertyAnimator

کلاس ViewPropertyAnimator که نخستین مرتبه در ورژن 3.1 اندروید معرفی شد، دسترسی به پویانمایی هایی که در سطح view ها رخ می دهد به مراتب سهولت بخشیده است.

تابع animate() در یک view شی ViewPropertyAnimator را باز می گرداند. شی نام برده این قابلیت را فراهم می کند که عملیات متحرک سازی (animation) را به صورت همزمان و همگام انجام دهید. این شی همچنین دارای یک رابط برنامه سازی کاربردی (API) روان می باشد و به برنامه نویس اجازه می دهد طول یا مدت متحرک سازی را خود تنظیم کند.

مقصود و وظیفه ی اصلی کلاس ViewPropertyAnimator تهیه و ارائه ی API بسیار ساده ویژه ی پویانمایی های متعارف است.

کد زیر نمونه ای از کاربرد این متد را نمایش می دهد.

// Using hardware layer
myView.animate().translationX(
400
).withLayer();

به منظور بهینه سازی کارایی می توان به ViewPropertyAnimator این امکان را داد که از یک hardware layout کمک بگیرد.

// Using hardware layer
myView.animate().translationX(
400
).withLayer();

همچنین می توان یک Runnable را خود به طور مستقیم گونه ای تعریف کرد تا هم در ابتدا و هم در انتهای پویانمایی (animation) اجرا شود.  

// StartAction 
       
    myView.animate().translationX(100).withStartAction(new Runnable(){
               
public void run(){
                    viewer.setTranslationX(
100-myView.getWidth());
                   
// do something 
       
        }
            });
       
// EndAction 
       
    myView.animate().alpha(0).withStartAction(new Runnable(){
               
public void run(){
                   
// Remove the view from the layout called parent 
       
            parent.removeView(myView);
                }
            });

setInterpolator() امکان ایجاد شی ای از نوع TimeInterpolator را فراهم کرده که تغییر مقدار را در طول زمان تعریف می کند. رویه ی استاندارد در اینجا به صورت خطی (linear) است. محیط اندروید تعداد متعددی به صورت پیش فرض تعریف می کند، برای مثال می توان به AccelerateDecelerateInterpolator اشاره کرد که در آن سرعت تغییر به آرامی و کندی آغاز شده ولی در اواسط افزایش می یابد و دوباره در انتها رو به کندی رفته و کاهش می یابد.

با صدا زدن تابع setEvaluator می توانید شی ای از نوع TypeEvaluator سِت کنید که به شما اجازه می دهد برای نوع property دلخواه، پویا نمایی (animation) پیاده سازی کنید. این امر در واقع از طریق ارائه ی ارزیاب های سفارشی (custom evaluator) ویژه ی نوع هایی که به صورت خودکار توسط سیستم اندروید درک، هضم و یا بکار گرفته نمی شوند صورت می گیرد.

animation layout

کلاس LayoutTransition متحرک سازی خودکار را روی تغییراتی که در طرح کلی (layout changes) رخ می دهد، فعال سازی می کند.

package com.example.android.layoutanimation;
import android.animation.LayoutTransition;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class MainActivity extends
Activity {
   
private ViewGroup viewGroup
;
    @Override
   
public void
onCreate(Bundle savedInstanceState) {
       
super
.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LayoutTransition l =
new
LayoutTransition();
        l.enableTransitionType(LayoutTransition.CHANGING);
       
viewGroup
= (ViewGroup) findViewById(R.id.container);
       
viewGroup
.setLayoutTransition(l);
    }
   
public void
onClick(View view) {
       
viewGroup.addView(new Button(this
));
    }
    @Override
   
public boolean
onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main
، menu);
       
return true
;
    }
}
 

استفاده از قابلیت پویانمایی در انتقال (transition) بین activity ها

می توان انیمیشن ها را در view اعمال کرد و یا آن ها را حین انتقال (transition) بین activity ها اعمال کرد.

کلاس ActivityOptions نیز امکان تعریف و پیاده سازی انیمیشن های سفارشی یا پیش فرض را فراهم می سازد. 

public void onClick(View view) {
    Intent intent =
new Intent(this
، SecondActivity.class);
    ActivityOptions options = ActivityOptions.makeScaleUpAnimation(view
،
0،
           
0، view.getWidth()، view.getHeight());
    startActivity(intent
،
options.toBundle());
}

2. آموزش view animation

در این بخش به نحوه ی استفاده از Properties Animation API می پردازیم.

پروژه ی جدیدی به نام com.vogella.android.animation.views به همراه activity ی به نام AnimationExampleActivity ایجاد کنید. فایل طرح بندی باید main.xml نام گذاری شده باشد. فایل گفته شده را به کد زیر تغییر دهید.

<?xml version="1.0" encoding="utf-8" ?>

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"

                android:id="@+id/layout"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:orientation="vertical">

     <linearlayout android:id="@+id/test"

                  android:layout_width="wrap_content"

                  android:layout_height="wrap_content">

         <button android:id="@+id/Button01"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:onclick="startAnimation"

                android:text="Rotate" />

         <button android:id="@+id/Button04"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:onclick="startAnimation"

                android:text="Group"></button>

         <button android:id="@+id/Button03"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:onclick="startAnimation"

                android:text="Fade" />

         <button android:id="@+id/Button02"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:onclick="startAnimation"

                android:text="Animate" />

     </linearlayout>

     <imageview android:id="@+id/imageView1"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:layout_centerhorizontal="true"

               android:layout_centervertical="true"

               android:src="@drawable/icon" />

     <textview android:id="@+id/textView1"

              android:layout_width="wrap_content"

              android:layout_height="wrap_content"

              android:layout_above="@+id/imageView1"

              android:layout_alignright="@+id/imageView1"

              android:layout_marginbottom="30dp"

              android:text="Large Text"

              android:textappearance="?android:attr/textAppearanceLarge" />

 </relativelayout>

حال menu resource زیر را ایجاد کنید.

<?xml version="1.0" encoding="utf-8" ?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

     <item android:id="@+id/item1"

          android:showasaction="ifRoom"

          android:title="Game">

    </item>

</menu>

Activity خود را به صورت زیر اصلاح کنید.

package com.vogella.android.animation.views;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class AnimationExampleActivity extends
Activity {
   
/** Called when the activity is first created. */
   
@Override
   
public void
onCreate(Bundle savedInstanceState) {
       
super
.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
   
public void
startAnimation(View view) {
       
float dest = 0
;
        ImageView aniView = (ImageView) findViewById(R.id.imageView1);
       
switch
(view.getId()) {
           
case
R.id.Button01:
                dest =
360
;
               
if (aniView.getRotation() == 360
) {
                    System.out.println(aniView.getAlpha());
                    dest =
0
;
                }
                ObjectAnimator animation1 = ObjectAnimator.ofFloat(aniView
،
                       
"rotation"، dest);
                animation1.setDuration(
2000);
                animation1.start();
               
// Show how to load an animation from XML
                // Animation animation1 = AnimationUtils.loadAnimation(this
،

                // R.anim.myanimation);
                // animation1.setAnimationListener(this);
                // animatedView1.startAnimation(animation1);
               
break;
           
case
R.id.Button02:
               
// shows how to define a animation via code
                // also use an Interpolator (BounceInterpolator)
               
Paint paint = new
Paint();
                TextView aniTextView = (TextView) findViewById(R.id.textView1);
               
float
measureTextCenter = paint.measureText(aniTextView.getText()
                       .toString());
                dest =
0
- measureTextCenter;
               
if (aniTextView.getX() < 0
) {
                    dest =
0
;
                }
                ObjectAnimator animation2 = ObjectAnimator.ofFloat(aniTextView
،

                       
"x"، dest);
                animation2.setDuration(
2000);
                animation2.start();
               
break
;
           
case
R.id.Button03:
               
// demonstrate fading and adding an AnimationListener
               
dest = 1
;
               
if (aniView.getAlpha() > 0
) {
                    dest =
0
;
                }
                ObjectAnimator animation3 = ObjectAnimator.ofFloat(aniView
،

                       
"alpha"، dest);
                animation3.setDuration(
2000);
                animation3.start();
               
break
;
           
case
R.id.Button04:
                ObjectAnimator fadeOut = ObjectAnimator.ofFloat(aniView
،
"alpha"،
                       
0f);
                fadeOut.setDuration(
2000
);
                ObjectAnimator mover = ObjectAnimator.ofFloat(aniView
،

                       
"translationX"، -500f، 0f);
                mover.setDuration(
2000
);
                ObjectAnimator fadeIn = ObjectAnimator.ofFloat(aniView
،
"alpha"،
                       
0f، 1f);
                fadeIn.setDuration(
2000
);
                AnimatorSet animatorSet =
new
AnimatorSet();
                animatorSet.play(mover).with(fadeIn).after(fadeOut);
                animatorSet.start();
               
break
;
           
default
:
               
break
;
        }
    }
    @Override
   
public boolean
onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.mymenu
،
menu);
       
return super.onCreateOptionsMenu(menu);
    }
    @Override
   
public boolean
onOptionsItemSelected(MenuItem item) {
        Intent intent =
new Intent(this
، HitActivity.class);
        startActivity(intent);
       
return true
;
    }
}

اکنون Activity جدیدی به نام HitActivity ایجاد کنید.

package com.vogella.android.animation.views;
import java.util.Random;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class HitActivity extends
Activity {
   
private ObjectAnimator animation1
;
   
private ObjectAnimator animation2
;
   
private Button button
;
   
private Random randon
;
   
private int width
;
   
private int height
;
   
private AnimatorSet set
;
    @Override
   
protected void
onCreate(Bundle savedInstanceState) {
       
super
.onCreate(savedInstanceState);
        setContentView(R.layout.target);
       
width
= getWindowManager().getDefaultDisplay().getWidth();
       
height
= getWindowManager().getDefaultDisplay().getHeight();
       
randon = new
Random();
       
set
= createAnimation();
       
set
.start();
       
set.addListener(new
AnimatorListenerAdapter() {
            @Override
           
public void
onAnimationEnd(Animator animation) {
               
int nextX = randon.nextInt(width
);
               
int nextY = randon.nextInt(height
);
               
animation1 = ObjectAnimator.ofFloat(button
، "x"، button.getX()،
                        nextX);
               
animation1.setDuration(1400);
               
animation2 = ObjectAnimator.ofFloat(button
، "y"، button.getY()،
                        nextY);
               
animation2.setDuration(1400);
               
set.playTogether(animation1
، animation2);
               
set
.start();
            }
        });
    }
   
public void
onClick(View view) {
        String string =
button
.getText().toString();
       
int hitTarget = Integer.valueOf(string) + 1
;
       
button
.setText(String.valueOf(hitTarget));
    }
   
private
AnimatorSet createAnimation() {
       
int nextX = randon.nextInt(width
);
       
int nextY = randon.nextInt(height
);
       
button
= (Button) findViewById(R.id.button1);
       
animation1 = ObjectAnimator.ofFloat(button
، "x"، nextX);
       
animation1.setDuration(1400);
       
animation2 = ObjectAnimator.ofFloat(button
، "y"، nextY);
       
animation2.setDuration(1400);
        AnimatorSet set =
new
AnimatorSet();
        set.playTogether(
animation1
، animation2);
       
return
set;
    }
}

پس از اجرای نمونه ی بالا و زدن دکمه های متفاوت، متحرک سازی باید راه اندازی شود. می توان از طریق ActionBar به activity دیگر خود پیمایش (دسترسی پیدا) کرد. 

3. بکارگیری قابلیت متحرک سازی بین تراکنش های fragment ها

این اجازه به برنامه نویس داده شده که متحرک سازی و انیمیشن را طی تراکنش های fragment ها تعریف کند که بعد بر اساس Property Animation API، با فراخوانی متد setCustomAnimations() مورد استفاده قرار می گیرد.

برنامه نویس همچنین می تواند با فراخواندن متد setTransition() از انیمیشن های استاندارد سیستم اندروید بهره جوید. انیمیشن های گفته شده توسط ثابت (constant) هایی که با FragmentTransaction.TRANSIT_FRAGMENT_*. آغاز می گردند، تعریف می شوند.

هر دو توابع که در بالا بیان شد، هم قابلیت تعریف entry animation و هم exiting animation را ایجاد می کنند.

1394/07/27 9835 3398
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...