Android画布定位和定制

Android画布定位和定制,android,canvas,android-vectordrawable,Android,Canvas,Android Vectordrawable,这就是我的设想: 我有一个svg图像,它包含了员工分类的精灵表上的所有音符 我有两个svg图像,其中包含密钥,也许我可以将它们合并在一起 所有这些都转换为android Vector Drawable 我想做的是从第一个svg中选择注释,选择谱号,然后将它们彼此相邻显示—两个图像应该对齐 因此,我设法实现的是为注释选择svg的一部分,以优化rect大小。但我仍然有一个问题,那就是在同一条线上显示它们 public MusicScore(Context context) { sup

这就是我的设想:

我有一个svg图像,它包含了员工分类的精灵表上的所有音符 我有两个svg图像,其中包含密钥,也许我可以将它们合并在一起 所有这些都转换为android Vector Drawable

我想做的是从第一个svg中选择注释,选择谱号,然后将它们彼此相邻显示—两个图像应该对齐

因此,我设法实现的是为注释选择svg的一部分,以优化rect大小。但我仍然有一个问题,那就是在同一条线上显示它们

public MusicScore(Context context) {
        super(context);
        paint = new Paint();
        paint.setColor(Color.BLACK);
        Resources res = context.getResources();
        musicClef = (VectorDrawable) res.getDrawable(R.drawable.ic_bassclef, null);
        musicNotes = (VectorDrawable) res.getDrawable(R.drawable.ic_musicnotes, null);
        int width = getWidth();
        int height = getHeight();
        Log.i("MUSIC", "H: " + musicClef.getMinimumHeight() + " W: " + musicClef.getMinimumWidth());
    }

    @Override
    protected void onDraw(Canvas canvas){
        Log.i("MUSIC", "Called");
        int left = getWidth()/2;
        int top = getHeight()/2;
        musicClef.setBounds(0,0,musicClef.getIntrinsicWidth(), musicClef.getIntrinsicHeight()   );

        Bitmap source = Bitmap.createBitmap(musicNotes.getIntrinsicWidth(), musicNotes.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Bitmap clefSource = Bitmap.createBitmap(musicClef.getIntrinsicWidth(), musicClef.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas newcanvas = new Canvas(source);
        Canvas clefCanvas = new Canvas(clefSource);
        int notesLeft = musicClef.getIntrinsicWidth();
        int notesTop = musicClef.getIntrinsicHeight();
        musicNotes.setBounds(0, 0, musicNotes.getIntrinsicWidth(), musicNotes.getIntrinsicHeight());
        musicNotes.draw(newcanvas);
        musicClef.draw(clefCanvas);
        Rect rect = new Rect(1150,0,1700, musicNotes.getIntrinsicHeight());
        Rect rect2 = new Rect(notesLeft ,0, notesLeft + 450, musicNotes.getIntrinsicHeight());
        Rect clefRect = new Rect(0, 0, musicClef.getIntrinsicWidth(), musicClef.getIntrinsicHeight());

        canvas.drawBitmap(clefSource, null, clefRect, null);
        canvas.drawBitmap(source, rect, rect2, null);

    }
因此,通过该代码,我可以在将其转换为位图后显示部分可绘制的notes。我也可以画它们,水平位置是对齐的。问题是垂直位置没有对齐,我得到的是:

所以我知道我的代码是不正确的,我对android的canvas非常陌生,我一直在想该怎么做,到目前为止我学到的是:

为了选择图像的一部分,我需要将其转换为位图,我还没有找到任何直接使用VectorDrawable的方法 在使用DrawBitmap在画布上绘制位图时,第一个矩形表示我要显示的部分区域,第二个矩形表示显示区域的大小和位置。 为了让位图显示在画布上,我需要从位图创建一个画布并在其中绘制它,以便显示它。对吗? 所以我有几个问题:

我想了解如何垂直对齐图像,因此它们必须从相同的y形顶部开始。 我不确定矢量图像是否是最好的主意,也许将其转换为依赖于显示的PNG更好?或者画布的大小是相对于屏幕的?或者我需要使我的代码屏幕独立,我假设getIntrinsicWidth/Height返回图像的真实大小,所以我可能需要缩放它? 为什么我需要明确显示两幅图像的背景以显示它们? 更新1

所以我明白了为什么我的图像可能不在同一条线上对齐。看起来,在创建向量资产时,由于某种原因,调整了大小,不确定是安卓系统还是安卓studio在这样做。但不管怎样,我在加载两个像素高度相同的图像后发现,其中一个图像的高度是相同的,而另一个图像的高度是不同的,几乎是原来的两倍,这就解释了为什么图像在底部移动

所以我试着用音符和谱号制作一个图像,它在模拟器中工作。但在实际设备上进行测试时,我会发现错误:

W/OpenGLRenderer:位图太大,无法上载到纹理11732x1168,最大值=8192x8192 位图太大,无法上载到纹理11732x1168,最大值=8192x8192

我可以理解错误的含义,但无论如何,图像的像素大小是:2933x292像素。为什么getIntrinsicWidth和getIntrinsicHeight返回该维度?他们的衡量标准是什么

我在想,也许矢量绘图不是最好的选择?也许将其转换为依赖屏幕的PNG更好?并使用它们