我正在为Android开发一个家庭酿造家庭角色创建者。基本上你可以为你的角色选择头发,胡须,衬衫,裤子等。我使用复合图案来存储当前磨损的面部特征和衣服。我使用canvas来显示用户正在创建的自定义角色的当前状态。当我的活动开始时,画布立即绘制3个位图,但在此之后,当用户点击(触摸)头发类型时,例如由于某种原因(有时甚至长达约1分钟),绘图需要花费很长时间。我似乎无法找到任何合理的解释,为什么会发生这种情况。提前谢谢。
我的onCreate重写方法的一部分:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play);
character = new Character();
character.attach(this); //observes the character
assetManager = getAssets();
BitmapLoader.setAssetManager(assetManager);
/*...*/
characterView = (LinearLayout) findViewById(R.id.character_view);
initCanvas();
initButtons();
loadPersistedCharacter();
character.notifyAllObservers(); //just for testing purposes
}
我的画布初始化代码:
private void initCanvas() {
Paint paint = new Paint();
Bitmap background = Bitmap.createBitmap(600, 800, Bitmap.Config.ARGB_8888);
canvas = new Canvas(background);
paint.setColor(Color.parseColor("#CD5C5C"));
characterView.setBackground(new BitmapDrawable(getResources(), background));
}
当通过使用Observer模式单击服装或面部特征(在onClickListeners的帮助下)时,将调用update方法,该方法可以在与前一代码相同的Activity中找到。
@Override
public void update() {
Paint paint = new Paint();
Skin skin = character.getSkin();
Bitmap bitmap = BitmapLoader.load(skin.getPath());
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
float scale = skin.getScale();
int asd = bitmap.getWidth();
int asdY = bitmap.getHeight();
float coordX = (canvas.getWidth() - scale * asd) / skin.getXPosDivider();
float coordY = (canvas.getHeight() - scale * asdY) / skin.getYPosDivider();
RectF rect= new RectF(coordX, coordY, coordX + scale * bitmap.getWidth(), coordY + scale * bitmap.getHeight());
canvas.drawBitmap(bitmap, null, rect, paint);
for (HeadFeature feature : character.getHeadFeatures()) {
scale = feature.getScale();
bitmap = BitmapLoader.load(feature.getPath());
coordX = (canvas.getWidth() - scale * bitmap.getWidth()) / feature.getXPosDivider();
coordY = (canvas.getHeight() - scale * bitmap.getHeight()) / feature.getYPosDivider();
rect= new RectF(coordX, coordY, coordX + scale * bitmap.getWidth(), coordY + scale * bitmap.getHeight());
canvas.drawBitmap(bitmap, null, rect, paint);
}
}
答案 0 :(得分:0)
问题如下:我的characterView LinearLayout从未失效,因此很少刷新。应用程序根本不知道我的View应该刷新。对characterView.invalidate()的简单调用解决了这个问题。
public void update() {
/*...*/
characterView.invalidate();
}