Просмотр изображений с автопрокруткой Android

В моей деятельности у меня есть только ImageView. В нем src — это картинка, которая намного больше экрана. Я хочу, чтобы изображение медленно прокручивалось слева направо, пока не достигло правого поля фотографии, а затем начало прокручиваться назад влево, пока не было достигнуто левое поле. Затем начните все сначала. Мне нужно, чтобы это происходило в отдельном потоке, чтобы телефон не завис, пока это происходит. Это то, что мне нужно

Как я могу этого добиться? Есть ли виджет, который делает это по умолчанию?

ОБНОВЛЕННЫЙ КОД // макет:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mylinear"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="center"
        android:src="@drawable/rainforest" />

</RelativeLayout>

// и активность

public class MainActivity extends Activity {

    Animation           _translateAnimation;
    RelativeLayout        _relativeLoading = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        _translateAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, -100f, TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f);
        _translateAnimation.setDuration(5000);
        _translateAnimation.setRepeatCount(-1);
        _translateAnimation.setRepeatMode(Animation.REVERSE); // REVERSE
        _translateAnimation.setInterpolator(new LinearInterpolator());
        _relativeLoading = (RelativeLayout) findViewById(R.id.mylinear);
        _relativeLoading.startAnimation(_translateAnimation);
    }

Но это выходит за рамки картины. Я имею в виду, что прокрутка идет слева направо, «подталкивая» изображение влево и показывая белый фон ниже ImageView.

  • Кроме того, должно ли это быть внутри потока или что-то в этом роде? Мне нужно как-то выйти из этой «прокрутки», не используя кнопку «Назад». Мне нужна кнопка поверх ImageView (кнопка должна оставаться на месте), а onClick должен запускать другое намерение

  • Кажется, что изображение внутри ImageView обрезается, чтобы соответствовать размеру экрана. Как я могу преодолеть это?


person user1137313    schedule 21.08.2013    source источник
comment
Вы должны использовать TranslateAnimation с некоторым атрибутом Repeat   -  person An-droid    schedule 21.08.2013
comment
Также анимация с использованием изображений немного дергается...   -  person Tarun    schedule 23.11.2016


Ответы (3)


Пример:

private Animation           _translateAnimation;
private ImageView       _image;

_image = (ImageView)findViewById(R.id.yourimage);

_translateAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 100f, TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f);
_translateAnimation.setDuration(10000);
_translateAnimation.setRepeatCount(-1);
_translateAnimation.setRepeatMode(Animation.REVERSE);
_translateAnimation.setInterpolator(new LinearInterpolator());
_image.setAnimation(_translateAnimation);

Это заставит _linearLoading медленно переводить вправо и влево, вправо и влево...

Больше продолжительность = медленнее

TranslateAnimation.ABSOLUTE = Работа с положением изображения TranslateAnimation.RELATIVE_TO_PARENT = Работа с родительским макетом...

Метод TranslateAnimation (начало x, конец x, начало y, конец y)

играть с этим

person An-droid    schedule 21.08.2013
comment
Пожалуйста, проверьте мой вопрос на наличие обновленного кода с использованием TranslateAnimation, который не работает... - person user1137313; 21.08.2013
comment
_linearLoading должно быть тем, что вы хотите перевести, вот это ваше изображение. Поэтому вы должны получить его с помощью findviewbyid().. - person An-droid; 21.08.2013
comment
Я думаю, что моя ошибка в том, что я анимирую изображение... и кажется, что изображение обрезает фактическое изображение до видимого размера, потому что независимо от того, где я делаю свой перевод, появляется белый фон вместо того, чтобы показывать больше исходного изображения. Что мне сделать, чтобы увидеть остальную часть картинки вместо фона? - person user1137313; 21.08.2013
comment
Я использую этот код для перевода linearLayout с фоновым изображением на экране загрузки, и он отлично работает. Поиграйте с типом шкалы, если изображение - person An-droid; 21.08.2013
comment
Если я сделаю это с linearLayout вместо ImageView, приложение вылетит. Можете ли вы разместить здесь весь код анимации, который вы используете и который у вас работает? У меня не работает. Он падает. - person user1137313; 21.08.2013
comment
Да ладно... Весь код здесь, и он отлично работает. Если вы хотите переместить изображение, вы устанавливаете анимацию в соответствии с изображением, если вы хотите переместить макет, вы устанавливаете анимацию в макете. Больше нечего делать. Конечно, вы должны получить представление, которое хотите переместить, с помощью findViewById до этого! - person An-droid; 21.08.2013
comment
Хорошо... :) проблема заключалась в том, что я не нашел linearView, прежде чем захотел его переместить. Теперь не вылетает. Но все же я не вижу всей картины, вместо нее я вижу фон. Пожалуйста, взгляните на мой макет (отредактированный в моем вопросе выше)... очень пожалуйста.... - person user1137313; 21.08.2013
comment
Для представления изображения используйте wrap_content как для высоты, так и для ширины. Для scaleType используйте CENTER (CENTER_CROP тоже может работать), не используйте layout_weight, а marginTop=0dp бесполезен. Затем проверьте это - person An-droid; 21.08.2013
comment
Я сделал это, как вы можете видеть в моем обновленном вопросе выше ... изображение все еще скользит по экрану (как и должно быть), но оно обрезано, я вижу белый фон, заполняющий пространство, где раньше было изображение. И моя цель — увидеть остальную часть изображения, а не белый фон. Можете ли вы помочь мне с этим? - person user1137313; 21.08.2013
comment
(используя это, я могу без проблем вывести изображение на экран) Пробовали ли вы ScaleType CENTER_CROP? - person An-droid; 21.08.2013
comment
Может я не так себя понял. Изображение имеет ширину 2000 пикселей. На экране видно только 480 пикселей, я думаю (неважно сейчас). Однако я хочу, чтобы изображение скользило слева направо, показывая остальную часть изображения... - person user1137313; 21.08.2013
comment
понял, и с этим методом должно работать! это работает для меня ^^ - person An-droid; 21.08.2013
comment
Я добавлю ответ с тем, что я сделал в конце концов, но я буду приписывать баллы Yume117, так как его / ее помощь привела меня туда. Спасибо @Yume117 - person user1137313; 21.08.2013

Итак, решение моей проблемы здесь (для всех новых разработчиков Android, таких как я, которым это может понадобиться для их приложений):

public class MainActivity extends Activity {

    Animation           _translateAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        _translateAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, -300f, TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f);
        _translateAnimation.setDuration(8000);
        _translateAnimation.setRepeatCount(-1);
        _translateAnimation.setRepeatMode(Animation.REVERSE); // REVERSE
        _translateAnimation.setInterpolator(new LinearInterpolator());
        ImageView img = (ImageView) findViewById(R.id.img);
        img.startAnimation(_translateAnimation);
    }
}

и макет:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/global_relative"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical"
    >

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="600dp"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@drawable/rainforest"
        android:scaleType="center"
        android:src="@drawable/rainforest613x490" >

    </ImageView>
</ScrollView>  
</RelativeLayout>

просто убедитесь, что ваше изображение достаточно большое/высокое, чтобы соответствовать экрану, и (+300 dp) шире, чем ширина экрана (или отрегулируйте код выше).

Удачного кодирования ;)

person user1137313    schedule 21.08.2013
comment
Потрясающий! Работал на меня. - person Peter Arandorenko; 20.01.2014
comment
Эй, я столкнулся с той же проблемой, не могли бы вы помочь мне в этом... я борюсь с этим последние 3 часа... Спасибо. - person Gowtham Raj; 23.08.2014
comment
Представление прокрутки не обязательно, трюк заключался в том, чтобы установить пользовательскую ширину для ImageView (600dp), а затем установить центр типа шкалы, а затем добавить анимацию перевода в ImageView. - person Amit Tumkur; 14.05.2016

Что вы можете сделать, так это добавить ImageView внутрь ScrollView. Как это

<ScrollView
    android:id="@+id/img_scroll"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/IMAGENAME" />
</ScrollView>

Поскольку вы хотите автоматически прокручивать изображение, вы можете создать AsyncTask и внутри метода doInBackground(), создать new Runnable или runOnUiThread() и отправить команды в ScrollView, используя его идентификатор для прокрутки по мере необходимости.

person Community    schedule 21.08.2013
comment
Можете ли вы дать мне код подсказки о том, как отправлять команды в прокрутку? - person user1137313; 21.08.2013