Android:构建2D头像定制的最佳实践

Android:构建2D头像定制的最佳实践,android,android-custom-view,custom-view,avatar,Android,Android Custom View,Custom View,Avatar,我正在尝试创建一个2D头像定制程序,而无需在我的Android应用程序中使用游戏引擎 我将基本上有一个PNG图像作为基础开始。然后,我想层的基础上的其他图像自定义角色 创建此项的最佳选项是什么?我已经创建了一个自定义的ImageView,并覆盖了onDraw(): 通过使用坐标,这似乎非常具体。有没有更好的方法来实现这一点而不必使用坐标 编辑: 这是我到目前为止所拥有的。这家伙是一个独立的形象,从红帽 如果您计划动态添加该图像视图,则无法在不指定像素轴的情况下放置这些图像 自定义类中的一个问题是

我正在尝试创建一个2D头像定制程序,而无需在我的Android应用程序中使用游戏引擎

我将基本上有一个PNG图像作为基础开始。然后,我想层的基础上的其他图像自定义角色

创建此项的最佳选项是什么?我已经创建了一个自定义的
ImageView
,并覆盖了
onDraw()

通过使用坐标,这似乎非常具体。有没有更好的方法来实现这一点而不必使用坐标

编辑:

这是我到目前为止所拥有的。这家伙是一个独立的形象,从红帽


如果您计划动态添加该
图像视图
,则无法在不指定像素轴的情况下放置这些图像

自定义类中的一个问题是,永远不要在
onDraw
方法中
decodeResource
,因为它将被多次调用,并且会导致
大滞后问题
,而是在
AvatarView
中创建一个init方法并对其进行解码,然后在所有构造函数中调用该init方法

示例:

public class AvatarView extends ImageView {

private Bitmap body;
private Bitmap hat;
public AvatarView(Context context) {
    super(context);
    init();
}

public AvatarView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public AvatarView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init()
{
  body = getResources(), R.drawable.battle_run_char);
  hat = getResources(), R.drawable.red_cartoon_hat);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(BitmapFactory.decodeResource(body , 0, 70, null);
    canvas.drawBitmap(BitmapFactory.decodeResource(hat , 70, 0, null);
}

}

@罗德·阿尔冈琴编辑了原稿。这就是我目前所拥有的。在我投入更多的精力和时间之前,我只是想看看这是否是最好的方法。我也在看这个应用程序:但不确定代码有多广泛。关于解码资源,请及时注意。你会推荐(在你看来)这将是头像定制的一个好选择吗?这就是使用坐标进行自定义视图。仅为了创建虚拟形象而添加游戏引擎似乎有点过火了,对吗?@TheNomad我不会,记住所有屏幕设备都有不同的像素计数,所以当您在像素计数较高的设备上尝试此功能时,它看起来不会像上面的图片。@TheNomad我建议为每个自定义使用一个图像。但是这需要很多图像。嗯,每个定制有一个图像看起来像是一个黑客的工作。最终,我们会有这么多不同的组合:帽子、衬衫、裤子、手套等等——组合太多了。我必须考虑其他的选择。谢谢你提供其他密度尺寸的信息。我们将研究SVG选项。
public class AvatarView extends ImageView {

private Bitmap body;
private Bitmap hat;
public AvatarView(Context context) {
    super(context);
    init();
}

public AvatarView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public AvatarView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init()
{
  body = getResources(), R.drawable.battle_run_char);
  hat = getResources(), R.drawable.red_cartoon_hat);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(BitmapFactory.decodeResource(body , 0, 70, null);
    canvas.drawBitmap(BitmapFactory.decodeResource(hat , 70, 0, null);
}

}