Android: 使离屏位图在移动时可见
Android: making offscreen bitmap visible when moved
我需要开始 activity 中间有两个圆形位图,它们应该立即动画并稍微移动到一边,这样一个位图的一部分就在屏幕外并且不可见。稍后,当用户离开 activity 时,它应该以相同的方式但向后动画(从一侧移动到中心)。
所以我实现了一个 class 将这些位图绘制在它们的主要位置(侧面),我现在遇到的问题是,当我为它们制作动画时,屏幕外的部分位图从未显示,所以在我的屏幕上我看到一个丑陋的移动位图,缺少一块。
位图是这样绘制的:
public class MyImageView extends ImageView {
private Canvas offscreen;
private static Bitmap pattern;
private static Bitmap logo;
private static int screenWidth, screenHeight; //The real size of the screen
private static int patternDiameter, logoDiameter; //bitmaps' dimensions, both images are circles
private static float topPatternMargin, leftPatternMargin;
private static float topLogoMargin, leftLogoMargin;
public MyImageView (Context context, AttributeSet attrs) {
super(context, attrs);
screenWidth = getSize(context)[0];
screenHeight = getSize(context)[1];
patternDiameter = (int)(screenWidth * (1005.0/1280.0));
logoDiameter = (int)(patternDiameter * (230.0/502.5));
pattern = BitmapFactory.decodeResource(context.getResources(), R.drawable.start_pattern);
pattern = Bitmap.createScaledBitmap(pattern, patternDiameter, patternDiameter, false);
logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.start_logo);
logo = Bitmap.createScaledBitmap(logo, logoDiameter, logoDiameter, false);
leftPatternMargin = (float) ((screenWidth) * (430.0/1280.0) - (patternDiameter/2.0));
topPatternMargin = (float) ((screenHeight - patternDiameter)/2.0);
leftLogoMargin = (float) (leftPatternMargin + patternDiameter/2.0 - logoDiameter/2.0);
topLogoMargin = (float)(topPatternMargin + patternDiameter/2.0 - logoDiameter/2.0);
offscreen = new Canvas(pattern);
}
@Override
protected void onDraw(Canvas canvas) {
if(canvas==offscreen)
super.onDraw(offscreen);
else {
super.draw(offscreen);
canvas.drawBitmap(pattern, leftPatternMargin, topPatternMargin, null);
canvas.drawBitmap(logo, leftLogoMargin, topLogoMargin, null);
}
}
}
所以我的问题是如何更改此代码(或可能是其他代码),以便当我创建此 class 的实例时,它的所有部分都对用户可见?
我在这里找到了答案:
When drawing outside the view clip bounds with Android: how do I prevent underling views from drawing on top of my custom view?
解决方案是将这一行添加到布局中:
android:clipChildren="false"
我需要开始 activity 中间有两个圆形位图,它们应该立即动画并稍微移动到一边,这样一个位图的一部分就在屏幕外并且不可见。稍后,当用户离开 activity 时,它应该以相同的方式但向后动画(从一侧移动到中心)。
所以我实现了一个 class 将这些位图绘制在它们的主要位置(侧面),我现在遇到的问题是,当我为它们制作动画时,屏幕外的部分位图从未显示,所以在我的屏幕上我看到一个丑陋的移动位图,缺少一块。
位图是这样绘制的:
public class MyImageView extends ImageView {
private Canvas offscreen;
private static Bitmap pattern;
private static Bitmap logo;
private static int screenWidth, screenHeight; //The real size of the screen
private static int patternDiameter, logoDiameter; //bitmaps' dimensions, both images are circles
private static float topPatternMargin, leftPatternMargin;
private static float topLogoMargin, leftLogoMargin;
public MyImageView (Context context, AttributeSet attrs) {
super(context, attrs);
screenWidth = getSize(context)[0];
screenHeight = getSize(context)[1];
patternDiameter = (int)(screenWidth * (1005.0/1280.0));
logoDiameter = (int)(patternDiameter * (230.0/502.5));
pattern = BitmapFactory.decodeResource(context.getResources(), R.drawable.start_pattern);
pattern = Bitmap.createScaledBitmap(pattern, patternDiameter, patternDiameter, false);
logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.start_logo);
logo = Bitmap.createScaledBitmap(logo, logoDiameter, logoDiameter, false);
leftPatternMargin = (float) ((screenWidth) * (430.0/1280.0) - (patternDiameter/2.0));
topPatternMargin = (float) ((screenHeight - patternDiameter)/2.0);
leftLogoMargin = (float) (leftPatternMargin + patternDiameter/2.0 - logoDiameter/2.0);
topLogoMargin = (float)(topPatternMargin + patternDiameter/2.0 - logoDiameter/2.0);
offscreen = new Canvas(pattern);
}
@Override
protected void onDraw(Canvas canvas) {
if(canvas==offscreen)
super.onDraw(offscreen);
else {
super.draw(offscreen);
canvas.drawBitmap(pattern, leftPatternMargin, topPatternMargin, null);
canvas.drawBitmap(logo, leftLogoMargin, topLogoMargin, null);
}
}
}
所以我的问题是如何更改此代码(或可能是其他代码),以便当我创建此 class 的实例时,它的所有部分都对用户可见?
我在这里找到了答案:
When drawing outside the view clip bounds with Android: how do I prevent underling views from drawing on top of my custom view?
解决方案是将这一行添加到布局中:
android:clipChildren="false"