影响ScaleType或将Matrix应用于AnimationDrawable

时间:2011-06-27 03:09:24

标签: android animation matrix bitmap drawable

我可以轻松地使AnimationDrawable工作,但它总是拉伸到ImageView的完整大小(如果我有layout_height,宽度为fill_parent)。有趣的是,当我将layout_height,width设置为其他任何内容(wrap_content,特定像素等)时,动画根本不会显示。如果我使用Image setImage或setBackgroundImage,则无关紧要,结果相同。

如果我可以将现有的Matrix应用于整个AnimationDrawables列表,那将是理想的。

这是代码...... `

            wxChartAnimation = new AnimationDrawable(); 
            int numCharts = subChart.getChartCount();
            for (int i=0; i < numCharts; i++) {
                WeatherChart.BaseChart baseChart = subChart.getBaseChart(i);
                File file = new File(baseChart.localPath);
                if (file != null && file.exists()) {
                    Drawable d = Drawable.createFromPath(baseChart.localPath);
                    if (d != null) {
                        if (wxChartAnimation != null) {
                            wxChartAnimation.addFrame(d,250);
                        }
                    }
                }
            }

            wxChartAnimation.setOneShot(false);
            wxChartImage.setImageDrawable(wxChartAnimation);
            wxChartAnimation.start();`

2 个答案:

答案 0 :(得分:0)

我也遇到过这个问题。为了它的价值,我为我的目的遇到了一个黑客的解决方法。看来,当您使用“new AnimationDrawable()”以编程方式创建AnimationDrawable时,它将不会遵循ImageView的scaleType。但是,如果您使用带有参考资源drawable内部框架列表的.anim xml资源,它将获取第一个图像的大小并根据ImageView的scaleType适当缩放动画。因为我试图将assets文件夹中的图像加载到我的AnimationDrawable中,所以我需要从代码中执行此操作。我最终做了以下事情:

在res / anim / empty.xml中(其中empty_slide是我将用于动画其余部分的大小的透明图像):

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

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/empty_slide" android:duration="0" />
</animation-list>

然后在我的java文件中:

imageView.setImageResource(R.anim.empty);
AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getDrawable();
animationDrawable.addFrame(Drawable.createFromStream(context.getAssets().open(drawablePath), null),animationDuration);
// Add the rest of the frames
...
animationDrawable.start();

我很想知道你是否找到了更好的方法......

答案 1 :(得分:0)

我找到了另一种方式...

问题是 - “new AnimationDrawable()”没有设置CurrentDrawable =&gt;没有设置AnimationDrawable的高度和宽度。

我用这种方式解决了问题:

protected void playFrameAnimationWithCurrentFrame(final ImageView ImView,final AnimationDrawable AnimDrawable){
    ImView.post(new Runnable(){
        public void run(){
            AnimDrawable.start();
        }});//We start the animation so that we have the current frame on which the matrix for mapping is based

    Thread t = new Thread() {
        @Override
        public void run() {
            while(AnimDrawable.getCurrent()==null){//wait for the current frame to appear                    
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            ImView.post(new Runnable(){//stop the current animation to assign animation to view and restart 
                public void run(){
                    AnimDrawable.stop();
                }});
                runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ImView.setImageDrawable(AnimDrawable);}
            });

            ImView.post(new Runnable(){
                public void run(){
                    AnimDrawable.start();}});
            interrupt();
        }};
    t.start();
}

之后,动画将使用我们之前在ImageView上安装的矩阵进行播放。

此方法不需要.xml资源文件。