Влияние на ScaleType или применение матрицы к AnimationDrawable - PullRequest
1 голос
/ 27 июня 2011

У меня нет проблем с получением AnimationDrawable для работы, но он всегда растягивается до полного размера ImageView (если у меня есть layout_height, width to fill_parent). Интересно, что когда я устанавливаю layout_height, width на что-либо еще (wrap_content, определенный пиксель и т. Д.), Анимация вообще не отображается. Не имеет значения, если я использую Image setImage или setBackgroundImage, те же результаты.

Что было бы идеально, если бы я мог применить существующую матрицу ко всему списку 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 голосов
/ 12 сентября 2017

Я нашел какой-то другой способ ...

Проблема в том, что "new AnimationDrawable ()" не установлен CurrentDrawable => не установлен высота и ширина AnimationDrawable.

Iрешил проблему следующим образом:

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.

0 голосов
/ 09 марта 2012

У меня тоже была эта проблема. Для чего это стоит, я наткнулся на обходной путь для моих целей. Кажется, что когда вы создаете AnimationDrawable программным способом, используя «new AnimationDrawable ()», он не будет учитывать scaleType ImageView. Однако, если вы используете ресурс .anim xml со списком фреймов внутри этого ссылочного ресурса, он примет размер первого изображения и масштабирует анимацию соответствующим образом в соответствии с scaleType вашего ImageView. Так как я пытаюсь загрузить изображения из папки ресурсов в мой 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();

Я бы хотел услышать, если бы вы нашли лучший способ ...

...