绘制位图

时间:2016-11-17 23:50:40

标签: android canvas bitmap

我正在为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);
}
}

1 个答案:

答案 0 :(得分:0)

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

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