用帆布平滑无尽的滚动背景?

时间:2015-01-26 22:05:36

标签: android canvas bitmap android-canvas android-bitmap

欢迎所有

我有一个背景图像,我想要的是它向右缓慢移动,当图像到达屏幕右端并且图像的左侧起始端结束时,图像必须开始再次显示右侧的开始,作为无限水平滚动。

如何在不生成位图溢出内存异常的情况下实现这一目标?

我尝试用画布绘制两次位图...但它不是很平滑,它是非常令人毛骨悚然的跳跃而没有优化:

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);
                   }    
               }
    }

由于

1 个答案:

答案 0 :(得分:0)

假设您不希望用户自己滚动此背景,您可以使用TranslateAnimationINFINITE param进行重复模式,它会很流畅。水平创建2 ImageView s(甚至简单View s并将Bitmap设置为背景)并移动其父级。当第一次离开屏幕时将其移除并在另一侧添加另一个。这是为了填充整个屏幕的背景照片/图像,如果你有其他尺寸的背景,只需添加更多ImageView s来创建2倍或更多的摘要长度而不是屏幕的宽度(可以在{{1}中轻松测量只需为背景图像创建类似onCreate的内容,甚至可以托管现有的项目/库,通常名为smth,如Adapter,其中HorizontalScrollView返回Adapter中的一些大数字,例如getCount

关于Integer.MAX_VALUE错误 - 请注意Bitmap不会销毁丢失/提取Adapter,但会将其用作下一个(重新创建) - View位于convertView {1}}方法。使用getView(...)模式,您只会使用两个ViewHolderView设置(相同的参考)。您可以在构造函数中创建一次静态背景Bitmap并保留LruCache以防止回收它。每个设备都可以处理与屏幕大小相同的位图