欢迎所有
我有一个背景图像,我想要的是它向右缓慢移动,当图像到达屏幕右端并且图像的左侧起始端结束时,图像必须开始再次显示右侧的开始,作为无限水平滚动。
如何在不生成位图溢出内存异常的情况下实现这一目标?
我尝试用画布绘制两次位图...但它不是很平滑,它是非常令人毛骨悚然的跳跃而没有优化:
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);
}
}
}
由于
答案 0 :(得分:0)
假设您不希望用户自己滚动此背景,您可以使用TranslateAnimation和INFINITE 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(...)
模式,您只会使用两个ViewHolder
个View
设置(相同的参考)。您可以在构造函数中创建一次静态背景Bitmap
并保留LruCache以防止回收它。每个设备都可以处理与屏幕大小相同的位图