`
昔雪似花
  • 浏览: 202109 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

图片在view中调用Animation动画移动

 
阅读更多
java code

package com.test.AnimationDemo;
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.view.animation.TranslateAnimation;

/**
* 2010-09-XX
*
* @author Chunter
*
*/
public class DemonView extends View {

    InputStream inputSteam = this.getContext().getResources()
            .openRawResource(R.drawable.icon);
    BitmapDrawable bmpDraw = new BitmapDrawable(inputSteam);

    float startX, startY, aimX, aimY;
    int msgTp = 1;

    public DemonView(Context context, AttributeSet attrs) {
        super(context, attrs);
        new T1().execute(new Object());
    }

    Animation mCurrentAnimation = null;
    Transformation mTransformation = new Transformation();

    Handler myHandler = new Handler() {
        public synchronized void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                initAndStartAmination(0, 0, 200, 200, bmpDraw); //ok
                ;
                break;
            case 2:
                initAndStartAmination(100.0f, 100.0f, 0, 0, bmpDraw); //这里就会有问题,实际没有移动到(0,0)
            }
            super.handleMessage(msg);
        }
    };

    public synchronized void onDraw(Canvas canvas) {
        // this.initalAmination(int startX,int start Y)
        this.makeBallMove(canvas, this.bmpDraw);
    }

    public void initAndStartAmination(float startX, float startY, float aimX,
            float aimY, BitmapDrawable bmpDraw) {
        Animation anim = new TranslateAnimation(startX, aimX, startY
                + bmpDraw.getBitmap().getHeight(), aimY
                + bmpDraw.getBitmap().getHeight());

        this.startX = startX;
        this.startY = startY;
        this.aimX = aimX;
        this.aimY = aimY;
        this.mTransformation = new Transformation();

        anim.setDuration(1000); // 1s
        anim.setInterpolator(new AccelerateInterpolator(1.0f));
        anim.setFillAfter(true);
        startAnimation(anim);
    }

    public void startAnimation(Animation animation) {
        // animation.setStartTime(animation.);
        setAnimation(animation);
        invalidate();
    }

    public void setAnimation(Animation animation) {
        mCurrentAnimation = animation;
        if (animation != null) {
            animation.reset();
        }
    }

    public void makeBallMove(Canvas canvas, BitmapDrawable bmpDraw) {

        long curTime = SystemClock.uptimeMillis();
        if (mCurrentAnimation == null) {

            canvas.drawBitmap(bmpDraw.getBitmap(), 0, 0, null);
        } else {
            if (!mCurrentAnimation.isInitialized()) // initialize animation

                mCurrentAnimation.initialize(0, 0, 0, 0);

            boolean more = mCurrentAnimation.getTransformation(curTime,
                    mTransformation);

            if (more) {

                Matrix m = canvas.getMatrix();

                canvas.setMatrix(mTransformation.getMatrix());

                canvas.drawBitmap(bmpDraw.getBitmap(), startX, startY, null);

                canvas.setMatrix(m);

                this.invalidate();

            } else {

                // canvas.drawBitmap(bmpDraw.getBitmap(), aimX, aimY, null);
                this.mCurrentAnimation = null;
                msgTp = (msgTp + 1) % 2 == 0 ? 2 : 1;

            }

        }

    }

    private class T1 extends AsyncTask {
        Object lock = new Object();

        @Override
        protected Object doInBackground(Object... arg0) {
            while (true) {
                try {
                    Thread.sleep(1999);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (mCurrentAnimation == null) {
                    messageSend(msgTp);
                }

            }

        }

        protected void onPostExecute(Object obj) {
            // do Nothing
        }
    }

    /**
     * notify UI Thread to refresh the ChessBoard
     *
     * @param i
     */
    private synchronized void messageSend(int i) {
        Message message = new Message();
        message.what = i;
        myHandler.sendMessage(message);
    }

}


xml code

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">

    <com.test.AnimationDemo.DemonView android:id="@+id/animotion_test" android:layout_width="match_parent"
        android:layout_height="match_parent" tileSize="24"/>
   
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/text"
            android:visibility="visible"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:textColor="#ff0000"
            android:textSize="24sp"
            />
    </RelativeLayout>

</FrameLayout>
分享到:
评论
1 楼 爱学习的傻瓜 2012-03-06  
我看了你的一些博客文章,怎么都没有加注释啊

相关推荐

    Web交互式图片展示插件(Interactive Photo Desk) v1.0.rar

    Interactive Photo Desk是一款web网页式交互图片展示插件,此插件适于网页桌面等开发,效果如上图所示。图片可以自由排列,亦可单张展示。...旋转动画在IE中是不支持的,所以我们在IE中是看不到图片旋转的。

    Android 滑动翻页源码

    一般实现这个特效会用到一个控件:ViewFlipper &lt;1&gt;View切换的控件—ViewFlipper ...为了显示出滑动的效果,这里调用了ViewFlipper的setInAnimation()和setOutAnimation()方法设置了View进入和退出的动画。

    Android 滑动翻页源码.zip

    如何实现手机上手动滑动翻页效果呢?呵呵,在这里我们就给你们介绍一下吧。...为了显示出滑动的效果,这里调用了ViewFlipper的setInAnimation()和setOutAnimation()方法设置了View进入和退出的动画。  

    android群雄传

    7.2.6 在XML中使用属性动画 170 7.2.7 View的animate方法 170 7.3 Android布局动画 171 7.4 Interpolators(插值器) 171 7.5 自定义动画 172 7.6 Android 5.X SVG矢量动画机制 175 7.6.1 标签 175 7.6.2 SVG...

    ViewPagerFragment滑动切换

    * 如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。 * 要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。 */ ...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量 |--回调函数的定义 |--图片之BitMap、Drawable、inputStream及byte[] 互转 |--图片之保存图片至...

    android开发资料大全

    Android 动画效果二 Frame Animation 动画专题研究 Android新浪客户端开发教程(完整版)汇总大全 Android多媒体实例大汇集(源码,全) Android中利用画图类和线程画出闪烁的心形,送给亲爱的他 android自带的示例...

    Visual C++2010开发权威指南(共三部分).part1.rar

    2.8.2 在框架类中获得当前的文档类和视图类对象指针 101 2.8.3 获得应用程序类对象的指针 101 2.8.4 从应用类对象中获得主框架类对象的指针 101 2.9 小结 102 第3章 Visual C++ 2010 MFC菜单编程 103 3.1 菜单编程 ...

    WPF编程宝典 part1

    15.4.2 在动画开始时应用缓动与在动画 结束时应用缓动 374 15.4.3 缓动函数类 375 15.4.4 创建自定义缓动函数 377 15.5 动画性能 379 15.5.1 期望的帧率 380 15.5.2 位图缓存 382 15.6 小结 384 第16章 高级动画 385...

    WPF编程宝典 part2

    15.4.2 在动画开始时应用缓动与在动画 结束时应用缓动 374 15.4.3 缓动函数类 375 15.4.4 创建自定义缓动函数 377 15.5 动画性能 379 15.5.1 期望的帧率 380 15.5.2 位图缓存 382 15.6 小结 384 第16章 高级动画 385...

    新版Android开发教程.rar

    谷歌早在 2002 年就进入了移动领域,可是由于目前的手机操作系统企业和手机企业相对封闭,提高了 行业的进入门槛,移动互联网的发展远没有拥有统一标准的传统互联网发展迅速,此次推出的开源手机操 作 系统平台就是...

    VC++2010权威开发指南+源代码

     2.8.2 在框架类中获得当前的文档类和视图类对象指针 101  2.8.3 获得应用程序类对象的指针 101  2.8.4 从应用类对象中获得主框架类对象的指针 101  2.9 小结 102  第3章 Visual C++ 2010 MFC菜单编程 103  ...

    VC++2010权威开发指南+源代码.part2

     2.8.2 在框架类中获得当前的文档类和视图类对象指针 101  2.8.3 获得应用程序类对象的指针 101  2.8.4 从应用类对象中获得主框架类对象的指针 101  2.9 小结 102  第3章 Visual C++ 2010 MFC菜单编程 103  ...

Global site tag (gtag.js) - Google Analytics