【问题标题】:Smooth endles scrolling background with canvas?用画布平滑无尽的滚动背景?
【发布时间】:2015-01-27 08:31:12
【问题描述】:

欢迎大家

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

如何在不产生位图溢出内存异常的情况下做到这一点?

我试着用画布画了两次位图……但它不流畅,跳跃非常令人毛骨悚然,而且没有优化:

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    假设您不希望用户自己滚动此背景,您可以使用TranslateAnimationINFINITE 参数作为重复模式,它会很流畅。水平创建 2 个ImageViews(甚至简单的Views 并将Bitmap 设置为背景)并移动它们的父级。当第一次离开屏幕时,将其移除并在另一侧添加另一个。这是用于填充整个屏幕的背景照片/图像,如果您有其他尺寸的背景,只需添加更多 ImageViews 以创建比屏幕宽度大 2 倍或更多的摘要长度(可以在 onCreate 或任何地方轻松测量。只需为背景图像创建类似Adapter 的东西,甚至您可以托盘现有项目/库通常命名为HorizontalScrollViewAdaptergetCount 中返回一些大数字,例如Integer.MAX_VALUE

    关于Bitmap 错误 - 请注意Adapter 不会破坏丢失/离开的Views,而是将它们用作下一个(重新创建) - 这是convertView 中的getView(...) 方法。使用ViewHolder 模式,您将只使用两个Views 和单个Bitmap 设置(相同的参考)。您可以在构造函数中只创建一次静态背景Bitmap 并保留在LruCache 中以防止回收它。每个设备都可以处理与屏幕大小相同的位图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2011-01-05
      • 2012-09-17
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多