位图转换为NinePatch再到新的缩放位图

3
我的问题是:
我需要创建一个使用NinePatch创建的重新缩放的位图。
我的当前系统从NinePatch文件创建一个位图。然后将其提供给NinePatch(或NinePatchDrawable)。然后我需要调整大小并输出到另一个位图。
我已经查看了this,它帮助了我很多。
这是我的当前代码:
try {
        Bitmap bitmap1 = BitmapFactory.decodeStream(getAssets().open("gfx/head.9.png"));

        // Using NinePatch?
        NinePatch patch = new NinePatch(bitmap1, bitmap1.getNinePatchChunk(), null);
        // Or NinePatchDrawable?
        NinePatchDrawable patch = new NinePatchDrawable(bitmap1, bitmap1.getNinePatchChunk(), new Rect(), null);

        // Set dimensions from NinePatch and create new bitmap
        // Bitmap bitmap2 = ?
}
catch (IOException e) {
        e.printStackTrace();
}
3个回答

15
public static Bitmap get_ninepatch(int id,int x, int y, Context context){
        // id is a resource id for a valid ninepatch

        Bitmap bitmap = BitmapFactory.decodeResource(
                context.getResources(), id);

        byte[] chunk = bitmap.getNinePatchChunk();
        NinePatchDrawable np_drawable = new NinePatchDrawable(bitmap,
                chunk, new Rect(), null);
        np_drawable.setBounds(0, 0,x, y);

        Bitmap output_bitmap = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output_bitmap);
        np_drawable.draw(canvas);

        return output_bitmap;
    }

X和Y是你想要的Ninepatch的大小,上下文是您的应用程序上下文,因此您可以获取位于ID位置的Ninepatch资源。

请注意,如果您打算在OpenGL中使用此位图,则X和Y必须是2的幂次方。


在获取实际位图之前,我们将如何获取x和y? - tasomaniac
解决方案中缺少的是位图是应用于 ImageView 的主要图像还是背景。 - Johann
能否知道id是否是有效的9 patch id而不是其他资源? - Renaud Favier
这个解决方案很好,但是那个 NinePatchDrawable 构造函数已经被弃用了 - 要使用非弃用版本,请将 context.getResources() 作为第一个参数传递(在 bitmap 之前)。 - VinceFior

0
你是在问如何绘制NinePatchDrawable吗?如果是,创建一个指向你想要绘制的位图的Canvas,并使用Drawable.draw()将NinePatchDrawable渲染到Canvas中。确保使用Drawable.setBounds设置所需的大小。

0
Tasomaniac - 为了获取我需要的方法中的x和y,我使用窗口或布局的大小或所需的九宫格。 如果您的窗口或布局可以重新调整大小,只需使用宽度和高度插入x和y,可能是:(例如popwindow)object.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()... 然后每次特定对象或布局发生变化时,只需将x和y转换为整数即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接