XML Drawable由两个图像组成

时间:2013-07-17 07:58:34

标签: android xml scale

我正在尝试创建一个XML Drawable,我将使用它而不是OSMDroid中的默认标记 这就是它最终应该是什么样子:

custom marker

在创建标记时将加载黑色部分,因为每个标记在那里将具有不同的图像。 (如果重要的话,这些将从数据库加载)

我尝试创建一个XML Drawable,它有点可以工作,但黑色部分似乎可以缩放以适合图像,从而使标记只是一个大的黑色方块。 (没有黑色部分它工作正常)

我目前的XML:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@drawable/marker"/>         // main

    <item android:drawable="@drawable/markerfill" />    // black part

</layer-list>

我尝试使用第二项的比例,但当我查看比例时,看起来我不能使用比例尺。

我想要的是什么:
我将黑盒加载到“main”部分,必要时调整其大小(同时保持比例)并从Java-Code更改它。 我将把这个标记用于OSMDroid。

最好的办法是什么?

3 个答案:

答案 0 :(得分:2)

  

我想要的是:我将黑匣子加载到“主”部分,如果是,则调整大小   必要的(保持比例)并改变它   Java的代码。我将把这个标记用于OSMDroid。

如果第一层图像在使用时不会调整大小/缩放(我不知道OSMDroid如何管理该标记)那么您可以使用LayerDrawable的当前方法并将“放置”动态图像LayerDrawable.setLayerInset()

public Drawable makeBasicMarker(Bitmap bitmap) {
        Drawable[] layers = new Drawable[2];
        layers[0] = new BitmapDrawable(getResources(),
                BitmapFactory.decodeResource(getResources(), R.drawable.marker));
        layers[1] = new BitmapDrawable(getResources(), bitmap);
        LayerDrawable ld = new LayerDrawable(layers);
        ld.setLayerInset(1, xx, xx, xx, xx); // xx would be the values needed so bitmap ends in the upper part of the image
        return ld;
    }

如果缩放图像,则需要自己创建Drawable并自行绘制部件以适当放置。

答案 1 :(得分:0)

尝试这样:1。使用第一个drawable定义视图; 2.使用drawBitmap()方法绘制第二个项目3.调用postInvalidate()方法重绘。

答案 2 :(得分:0)

在mBG上绘制mBar,指的是:

void onDraw(最终Canvas画布){

super.onDraw(canvas);

float zoomX = mWidth / (float) mBG.getWidth();
float zoomY = mHeight / (float) mBG.getHeight();

canvas.drawBitmap(mBG, 0, 0, null);

canvas.drawBitmap(mBG, new Rect(0, 0, mBG.getWidth(), mBG.getHeight()),
    new RectF(0, 0, mWidth, mHeight), null);

....
canvas.drawBitmap(mBar, new Rect(0, 0, (int) w, (int) h), new RectF(
    X_LOCATION * zoomX, Y_LOCATION * zoomY, (X_LOCATION + w)
        * zoomX, (Y_LOCATION + h) * zoomY), null);

}