0
当我开发Android家庭酿造家庭家伙字符创作者的Android慢帆布行为。基本上你可以选择一个头发,胡子,衬衫,裤子等你的角色。我正在使用复合图案来存储当前磨损的面部特征和衣服。我使用画布来显示用户正在创建的自定义字符的当前状态。当我的活动开始在画布上绘制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));
}
当衣服或面部特征是通过使用点击(与onClickListeners的帮助下) Observer模式的更新方法被调用,可以在与前面的代码相同的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);
}
}
你在绘制SurfaceView吗?我没有看到任何特殊的征税工作,花费一分钟才能绘制。另外,如果你在主线程上绘图,你会得到ANR崩溃(但是在SurfaceView线程上绘图不会导致这种情况)。 – DeeV
也小的优化,你会得到更好的性能,如果你不创建一个像'Paint'或'RectF'每次抽签周期的新对象。把他们放在课堂上,并使用他们的setter方法更新他们。 – DeeV
感谢您的提示。我没有使用SurfaceView,而是使用简单的LinearLayout。我尝试过使用SurfaceView,但onSurfaceCreated回调从未被调用过。再加上SurfaceView,我无法使背景变得透明。我不认为我正在接受ANR崩溃,只是因为某种奇怪的原因而没有立即绘制它。绘图发生在我猜测的主线程上。 – masm64