2

MapFragment を使用して Android でアプリを作成しているので、マップビューの角を丸くしたいので、xml ファイルに形状を作成し、その形状をマップの背景として設定しますが、必要な結果が得られませんでした。マップの角は丸みを帯びていませんが、背景は丸みを帯びており、実際にはそれが私のコードで行われていることです。

4

3 に答える 3

2

私がまったく同じトピックについて尋ねたこの質問をチェックしてください。

Mapfragment に角を丸くする方法はありますか?

基本的に、適切な 9 パッチ画像を作成し、別のレイアウトを使用してマップに適用する必要がありますFrameLayout

于 2013-03-26T11:42:44.790 に答える
2

いくつかの調査を行ったところ、問題が見つかりました。さて、LinearLayout(またはフレームレイアウト)を拡張するビューを作成しました。このビューはそのようなものです

public class RoundedCornerMap extends LinearLayout{

Bitmap windowFrame;
//this constructer is needed by a tool in explipse to render the layout, you can not define it
public RoundedCornerMap(Context context, AttributeSet attr){
    super(context, attr);
}
//this 
public RoundedCornerMap(Context context, AttributeSet attr, View view) {
    super(context, attr);
    init(view);
}

private void init(View view) {

    view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
    view.setClickable(true);
    addView(view);
}

@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);

    if(windowFrame==null)
        createWindowFrame();// Lazy creation of the window frame, this is needed as we don't know the width & height of the screen until draw time

    canvas.drawBitmap(windowFrame, 0, 0, null);
}

private void createWindowFrame() {

    windowFrame= Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);// Create a new image we will draw over the map
    Canvas osCanvas = new Canvas(windowFrame);// Create a    canvas to draw onto the new image

    RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight());
    RectF innerRectangle = new RectF(10, 10, getWidth()-10, getHeight()-10);

    float radiusCorner = getWidth()/18f;// The angle of your corners

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);// Anti alias allows for smooth corners
    paint.setColor(getResources().getColor(Color.BLACK));// This is the color of your activity background
    osCanvas.drawRect(outerRectangle, paint);

    paint.setColor(Color.RED);// An obvious color to help debugging
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));// A out B http://en.wikipedia.org/wiki/File:Alpha_compositing.svg
    osCanvas.drawRoundRect(innerRectangle, radiusCorner, radiusCorner, paint);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {

    super.onLayout(changed, l, t, r, b);

    windowFrame=null;// If the layout changes null our frame so it can be recreated with the new width and height
}

}

Mapfragment を拡張する Fragment の onCreate メソッドは次のようになります。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    XmlPullParser parser = getResources().getXml(R.layout.rounded_corner_map);
    AttributeSet attr = Xml.asAttributeSet(parser);


    View view=new RoundedCornerMap(myActivity, attr, super.onCreateView(inflater, container, null));
    //ignore about this line below i just want to set a shape to the view
    //view.setBackgroundResource(R.drawable.map_shape);
    return view;
}

xml ファイル rounded_corner_map を次のように定義する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<com.map.RoundedCornerMap xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

これがお役に立てば幸いです。

于 2013-03-27T16:28:09.170 に答える
-1

マップを LinearLayout/RelativeLayout などの任意のレイアウトまたは任意のレイアウトに配置し、その形状スタイルを [背景としてレイアウト] に設定します。

私の形状ファイル

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="10dp"/>
    <stroke android:color="#aa6632"/>
    <padding android:left="5dp" android:top="5dp"
        android:right="5dp" android:bottom="5dp"/>
</shape>

私のレイアウトファイル

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="300dp"
        android:layout_height="400dp" 
        android:layout_centerInParent="true"
        android:background="@drawable/test">
    <fragment
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />
    </LinearLayout>

</RelativeLayout>

FrameLayout代わりに使用することもできますLinearLayout

于 2013-03-26T11:44:48.000 に答える