2016-11-17 138 views
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); 
} 
} 
+0

你在绘制SurfaceView吗?我没有看到任何特殊的征税工作,花费一分钟才能绘制。另外,如果你在主线程上绘图,你会得到ANR崩溃(但是在SurfaceView线程上绘图不会导致这种情况)。 – DeeV

+0

也小的优化,你会得到更好的性能,如果你不创建一个像'Paint'或'RectF'每次抽签周期的新对象。把他们放在课堂上,并使用他们的setter方法更新他们。 – DeeV

+0

感谢您的提示。我没有使用SurfaceView,而是使用简单的LinearLayout。我尝试过使用SurfaceView,但onSurfaceCreated回调从未被调用过。再加上SurfaceView,我无法使背景变得透明。我不认为我正在接受ANR崩溃,只是因为某种奇怪的原因而没有立即绘制它。绘图发生在我猜测的主线程上。 – masm64

回答

0

问题是:我的characterView LinearLayout从未失效,因此它很少刷新。应用程序根本不知道我的View应该被刷新。对characterView.invalidate()的简单调用解决了这个问题。

public void update() { 
    /*...*/ 
    characterView.invalidate(); 
}