--/--/--(--)


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
コメント(-) | トラックバック(-) | --:--:--

2010/10/30(土)


パラパラ漫画のようなアニメーションは、画像ファイルでanimation-listを作り、AnimationDrawableクラスを使って実装します。リソースをsetした時点で1枚目の画像が表示されるので、たとえば何かのトリガーで突然表示させたい場合などは、1枚目の画像を透明にするか、サンプルコードのようにトリガーが引かれてからsetBackgroundResource()するといいです。
なお、AnimationDrawableのstart()は、アニメーションが完了する前に復帰してきます。

アニメーション画像ファイル
res/drawable/anim1.png
res/drawable/anim2.png
res/drawable/anim3.png
res/drawable/anim4.png
res/drawable/anim5.png

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.widget.ImageView;
 
public class MyClass extends Activity{
 
 public void startAnimation(){
  ImageView animView = (ImageView)findViewById(R.id.animview);
  animView.setBackgroundResource(R.anim.myAnim);
  AnimationDrawable anim = (AnimationDrawable)animView.getBackground();
  anim.setOneShot(true); // 1回で終わる
  if(anim.isRunning()) anim.stop(); // アニメーション中なら止める
  anim.start();
 }
}

res/anim/myAnim.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
 android:oneshot="true"
>
 <item android:duration="200" android:drawable="@drawable/anim1" />
 <item android:duration="150" android:drawable="@drawable/anim2" />
 <item android:duration="200" android:drawable="@drawable/anim3" />
 <item android:duration="200" android:drawable="@drawable/anim4" />
 <item android:duration="120" android:drawable="@drawable/anim5" />
</animation-list>

スポンサーサイト
コメント(0) | トラックバック(1) | 12:24:58

2010/10/23(土)


XMLで記述した場合はこうなります。

import android.app.Activity;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
 
public class MyClass extends Activity{
 
 public void startAnimation(){
  ImageView image = (ImageView)findViewById(R.id.animView);
  Animation anim = AnimationUtils.loadAnimation(this,R.anim.myAnim);
 
  // 即時アニメーション開始
  image.startAnimation(anim);
 
  // android:startOffsetで設定された時間後に開始
  image.setAnimation(anim);
 }
} 

res/anim/cycle.xml
<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
 android:cycles="1"
/>

res/anim/myAnim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:interpolator="@anim/cycle"
 android:fillBefore="false"
 android:fillAfter="true"
 android:repeatMode="restart" // "restart" or "reverse"
 android:repeatCount="10" // "n" or "0"(リピートなし) or "-1"(永久)
>
 
<alpha
 android:fromAlpha="0.0"
 android:toAlpha="1.0"
 android:duration="1000"
 android:startOffset="1000"
/>
 
<rotate
 android:fromDegrees="0"
 android:toDegrees="360"
 android:pivotX="100"
 android:pivotY="100"
/>
 
<scale
 android:duration="10000"
 android:fromXScale="0.0"
 android:toXScale="0.1"
 android:fromYScale="0.0"
 android:toYScale="0.1"
 android:pivotX="100"
 android:pivotY="100"
/>
 
<translate
 // "%":RELATIVE_TO_SELF or "%p":RELATIVE_TO_PARENT
 android:fromXDelta="-100%p"
 android:toXDelta="0%p"
 android:fromYDelta="0%p"
 android:toYDelta="0%p"
/>
 
</set>

コメント(0) | トラックバック(0) | 12:10:04

2010/10/23(土)


変形によるアニメーションには、透過・回転・拡縮・移動の4種類があります。AnimationSetを使用することにより、アニメーションを組み合わせることも可能です。
注意点としては、setAnimation()やstartAnimation()は、アニメーションが完了する前に復帰してきます。裏で別スレッドに処理をまかせているのでしょう。

import android.app.Activity;
import android.view.animation.Animation;
import android.view.animation.AlphaAnimation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.view.animation.CycleInterpolator;
import android.view.animation.AnimationSet;
import android.widget.ImageView;
 
public class MyClass extends Activity{
 
 public void startAnimation(){
  ImageView image = (ImageView)findViewById(R.id.animView);
  Animation anim = _getAnimation();
 
  // 即時アニメーション開始
  image.startAnimation(anim);
 
  // setStartOffSetで設定された時間後に開始
  image.setAnimation(anim);
 }
 
 private Animation _getAnimation(){
  int px = 100; // アニメーションの中心X座標軸
  int py = 100; // アニメーションの中心Y座標軸
 
  // Alpha 透過
  // 0 ~ 1 透明から不透明へ
  Animation alpha = new AlphaAnimation(0.0f,1.0f);
  alpha.setDuration(1000); // 1000msかけて動く
  alpha.setStartOffset(1000); // 1000ms後に開始
 
  // Rotate 回転
  // 0°~ 360°(1回転する)
  Animation rotate = new RotateAnimation(0.0f,360f,px,py);
 
  // Scale 拡大縮小
  // from幅倍率,to幅倍率,from高さ倍率,to高さ倍率,中心軸X,中心軸Y
  Animation scale = new ScaleAnimation(0.0f,1.0f,0.0f,1.0f,px,py);
 
  // Translate 移動
  // fromX座標,toX座標,fromY座標,toY座標
  // ABSOLUTE:直接座標
  // RELATIVE_TO_PARENT:親要素に対しての相対値
  // RELATIVE_TO_SELF:自身に対しての相対値
  Animation trans = new TranslateAnimation(
   Animation.RELATIVE_TO_PARENT,-1.0f,
   Animation.RELATIVE_TO_PARENT,0.0f,
   Animation.RELATIVE_TO_PARENT,0.0f,
   Animation.RELATIVE_TO_PARENT,0.0f);
 
  // アニメーションの組み合わせ
  // true:補間をsetに適用 false:補間を個々に指定
  AnimationSet set = new AnimationSet(true);
  set.addAnimation(alpha);
  set.addAnimation(scale);
  set.addAnimation(rotate);
  set.addAnimation(trans);
 
  // アニメーション補間
  // LinearInterpolator:default(等間隔)
  // AccelerateInterpolator:ゆっくりから徐々に速く
  // DecelerateInterpolator:速くから徐々にゆっくり
  // AccelerateDecelerateInterpolator:ゆっくり → 速く → ゆっくり
  // CycleInterpolator:指定回フェイントする
  // AnticipateInterpolator:勢いをつけて移動
  // OvershootInterpolator:勢いあまって行き過ぎる
  // AnticipateOvershootInterpolator:勢いをつけて移動し行き過ぎる
  // BounceInterpolator:バウンドする
  set.setInterpolator(new CycleInterpolator(1));
 
  // アニメーション終了時の動作
  set.setFillBefore(false); // true:終了時に元の状態に戻す
  set.setFillAfter(true); // true:終了時に元の状態に戻さない
 
  // リピート
  // RESTART:リピートする REVERSE:前回と逆の動作
  set.setRepeatMode(Animation.RESTART);
  set.setRepeatCount(10); // リピート回数(0でリピートなし、-1で永久)
 
  return set;
 }
}

コメント(0) | トラックバック(0) | 12:04:28

2010/10/16(土)


Viewコンポーネントのタッチイベントについて、もう少し詳細に説明します。
たとえば画面を指で触ったとき、触った指を離したとき、画面上をスライドさせたとき、などその契機ごとにOnTouchListenerが呼び出されます。
タッチした時間や位置(座標)、押す強さなんかもリスナーで取得できるようです。

import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
 
public class MyClass extends Activity implements OnTouchListener{
 
 public void myMethod(){
  LinearLayout layout = (LinearLayout)this.findViewById(R.id.myLayout);
  layout.setOnTouchListener(this);
 }
 
 public boolean onTouch(View v,MotionEvent event){
  // アクションを取得
  int action = event.getAction();
  switch(action){
   case MotionEvent.ACTION_DOWN: // 押す
   case MotionEvent.ACTION_UP: // 離す
   case MotionEvent.ACTION_MOVE: // 動かす
   case MotionEvent.ACTION_CANCEL: // 押している間にキャンセル
  }
 
  // イベント開始(押した)時刻(恐らくアプリ起動からの経過時間ミリ秒)
  long start = event.getDownTime(); // [ms]
 
  // このイベントの発生時刻(恐らくアプリ起動からの経過時間ミリ秒)
  long now = event.getEventTime(); // [ms]
 
  // 絶対座標
  float ax = event.getRawX();
  float ay = event.getRawY();
 
  // 相対座標
  float x = event.getX();
  float y = event.getY();
 
  // 押す強さ(0.0 ~ 1.0 1.0 = normal)
  float pressure = event.getPressure();
 
  // true:次のイベントを処理しない
  return false;
 }
}

コメント(0) | トラックバック(0) | 12:43:38

2010/10/15(金)


ボタンなどのViewコンポーネントがクリックされたときのイベント処理を行いたい場合は、Viewのイベントリスナーを実装します。クリックに関連するイベントには、以下の3つのリスナーが用意されています。

・View.OnClickListener (クリックしたときに呼ばれる)
・View.OnLongClickListener (長押ししたときに呼ばれる)
・View.OnTouchListener (画面をタッチしたときに呼ばれる)

1回のクリックで、それぞれ以下の順番で呼び出されます。

1) View.OnTouchListener.onTouch(); (押された)
2) View.OnLongClickListener.onLongClick(); (長押しされた)
3) View.OnTouchListener.onTouch(); (離れた)
4) View.OnClickListener.onClick(); (クリックされた)

2)は長押しされた場合にのみ呼び出されます。

import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
 
public class MyClass extends Activity{
 
 public void myMethod(){
  Button btn = (Button)this.findViewById(R.id.myButton);
 
  // タッチイベント
  // ボタンを押すとACTION_DOWN、離すとACTION_UPが発生
  btn.setOnTouchListener(new View.OnTouchListener(){
   public boolean onTouch(View v,MotionEvent event){
    int action = event.getAction();
    switch(action){
     case MotionEvent.ACTION_DOWN: // 押す
     case MotionEvent.ACTION_UP: // 離す
    }
 
    // trueにすると以下のOnLongClickやOnClickが呼ばれない
    return false;
   }
  });
 
  // 長押しイベント
  btn.setOnLongClickListener(new View.OnLongClickListener(){
   public boolean onLongClick(View v){
    // trueにすると以下のOnClickが呼ばれない
    return false;
   }
  });
 
  // クリックイベント
  btn.setOnClickListener(new View.OnClickListener(){
   public void onClick(View v){
   }
  });
 }
}

コメント(0) | トラックバック(0) | 12:27:44

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。