2017-01-23 4 views
0

я есть ImageViewандроида Положение изображения внутри ImageView анимации

<ImageView 
       android:id="@+id/loading" 
       android:layout_width="40dp" 
       android:layout_height="40dp" 
       android:scaleType="centerCrop" 
       android:layout_gravity="center_horizontal" 
       android:src="@drawable/spinner"/> 

и изображение enter image description here

я хочу создать анимацию, которая изменить положение изображения внутри ImageView

я попробовал этот

android:scrollX="-80dp" 

это в xml a d static i want animation

+0

TranslateAnimation? –

+0

Как? Переведите анимацию, выполненную в виде изображения, а не внутри. –

+0

проверьте это: http://stackoverflow.com/questions/36894384/android-move-background-continuously-with-animation –

ответ

1

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

Создание 4 полей, как показано ниже:

private ImageView mImageView; 
private Handler mImageChangingHandler; 
private int mCurrentImageIndex = 0; 
private BackgroundThread mImageUpdateThread; 

В onCreate() получить ImageView, пролитой ваши растровые изображения и добавить его в список и создать обработчик, который обновляет ImageView. Здесь вы должны знать номер отдельных растровых изображений, который находится в основным растровым изображением. Как:

mImageView = (ImageView) findViewById(R.id.img); 
Bitmap mainBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.anim); 
//number of individual bitmaps, which you should know. 
final int numberOfImages = 21; 
//individual bitmap width 
int bitmapWidth = mainBitmap.getWidth()/numberOfImages; 
//individual bitmap height 
int bitmapHeight = mainBitmap.getHeight(); 
//list which holds individual bitmaps. 
final List<Bitmap> animBitmaps = new ArrayList<>(numberOfImages); 
//split your bitmap in to individual bitmaps 
for (int index = 0; index < numberOfImages; index++) { 
    animBitmaps.add(Bitmap.createBitmap(mainBitmap, index * bitmapWidth, 0, bitmapWidth, bitmapHeight)); 
} 
//set 1st bitmap to imageView. 
mImageView.setImageBitmap(animBitmaps.get(mCurrentImageIndex)); 
mImageChangingHandler = new Handler(new Handler.Callback() { 
    @Override 
    public boolean handleMessage(Message msg) { 
     //increament current bitmap index 
     mCurrentImageIndex++; 
     //if current index is greater than the number of images, reset it to 0 
     if (mCurrentImageIndex > numberOfImages - 1) { 
      mCurrentImageIndex = 0; 
     } 
      mImageView.setImageBitmap(animBitmaps.get(mCurrentImageIndex)); 
      return true; 
    } 
}); 
//Create the background thread by passing the handler and start. 
mImageUpdateThread = new BackgroundThread(mImageChangingHandler); 
mImageUpdateThread.setRunning(true); 
mImageUpdateThread.start(); 

И это будет ваш BackgroundThread.class:

public static class BackgroundThread extends Thread { 

    private Handler mHandler; 
    private boolean mRunning; 

    public BackgroundThread(Handler handler) { 
     mHandler = handler; 
    } 

    public void setRunning(boolean running) { 
     mRunning = running; 
    } 

    @Override 
    public void run() { 
     super.run(); 
     while (mRunning) { 
      try { 
       //this sleeps for 100 milliseconds 
       sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } finally { 
       //send message to handler after sleep 
       mHandler.sendEmptyMessage(0); 
      } 
     } 
    } 
} 

Наконец, в onDestroy() остановить поток. Как:

mImageUpdateThread.setRunning(false); 
boolean stopThread = true; 
    while (stopThread) { 
     try { 
      mImageUpdateThread.join(); 
      //thread already stopped 
      stopThread = false; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
mImageUpdateThread = null; 

Примечание: Если вы хотите увеличить скорость обновления, сократить время ожидания в потоке.