Гладкая прокрутка фона с холстом?

Добро пожаловать

У меня есть фоновое изображение, и я хочу, чтобы оно медленно двигалось вправо, и когда изображение достигает правого конца экрана с концом левой начальной стороны изображения, изображение должно снова начать показывать начало правой стороны в виде бесконечной горизонтальной прокрутки.

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

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

universeBitmap = Bitmap.createScaledBitmap(universeBitmap, sw, sh, false); 

    universeView = new View(this){

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            if (paused==true){
                canvas.drawBitmap(universeBitmap, universeX, 0, null);          
                return;
            }
            long currentTime=System.currentTimeMillis();
            if ((currentTime-lastdrawTime)>100){                    
                if (universeX>sw){
                    universeX=0;
                }
                lastdrawTime=currentTime;
                universeX+=1;
            }
            canvas.drawBitmap(universeBitmap, universeX, 0, null);
            canvas.drawBitmap(universeBitmap, universeX-sw, 0, null);
            invalidate();
        }   
    };

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

universeBitmap = Bitmap.createScaledBitmap(universeBitmap, sw, sh, false); 

            universeView = new View(this){

                @Override
                protected void onDraw(Canvas canvas) {
                    super.onDraw(canvas);               
                    canvas.drawBitmap(universeBitmap, universeX, 0, null);
                    canvas.drawBitmap(universeBitmap, universeX-sw, 0, null);
                }   
            };
.
.
.
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if (universeX>sw){
                    universeX=0;
                }
                universeView.invalidate();
                universeX+=1;
            }
        };  

.
.
.

     public void run() {
            try {
               while( !backgroundThread.interrupted() ) {
                   synchronized(this){  
                       handler.sendEmptyMessage(0);   
                       wait(100);
                   }    
               }
    }

Спасибо


person NullPointerException    schedule 26.01.2015    source источник


Ответы (1)


предполагая, что вы не хотите, чтобы пользователь прокручивал этот фон самостоятельно, вы можете использовать TranslateAnimation с помощью INFINITE param для режима повтора, он будет гладким. создайте 2 ImageViews по горизонтали (или даже простые Views и установите Bitmap в качестве фона) и переместите их родителя. когда вы впервые сойдете с экрана, удалите его и добавьте еще один с другой стороны. это для фоновой фотографии / изображения, заполняющего весь экран, если у вас есть фон другого размера, просто добавьте больше ImageView, чтобы создать 2-кратную или более суммарную длину, чем ширина экрана (что можно легко измерить в onCreate или где-либо еще. Просто создайте что-то вроде Adapter для фонового изображения или даже вы можете вывести существующие проекты/библиотеки, обычно называемые чем-то вроде HorizontalScrollView, где Adapter возвращает какое-то большое число в getCount, например, Integer.MAX_VALUE

об ошибках Bitmap - обратите внимание, что Adapter не уничтожает потерянные/ушедшие View, а использует их как следующие (воссоздает) - это convertView в методе getView(...). используйте шаблон ViewHolder, и вы будете использовать только два View с одной настройкой Bitmap (такая же ссылка). вы можете один раз создать свой статический фон Bitmap в конструкторе и сохранить в LruCache предотвращая его переработку. каждое устройство может обрабатывать растровые изображения того же размера, что и экран

person snachmsm    schedule 26.01.2015