2016-07-07 8 views
0

私のアプリでは、Googleマップビューにオーバーレイされるビットマップアイコンを作成する必要があります。Android画面サイズでのビットマップサイズの作成

public Bitmap makeBubble(int radius, int color) { 
    Bitmap bm = Bitmap.createBitmap(radius * 2, radius * 2, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bm); 

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setColor(color); 
    paint.setStyle(Paint.Style.FILL); 
    canvas.drawCircle(bm.getWidth()/2, bm.getHeight()/2, radius, paint); 

    paint.setColor(Color.argb(255, Color.red(color), Color.green(color), Color.blue(color))); 
    paint.setStyle(Paint.Style.STROKE); 
    canvas.drawCircle(bm.getWidth()/2, bm.getHeight()/2, radius, paint); 
    return bm; 
} 

ただし、これらのアイコンのサイズは画面の密度によって大きく異なることが予想されます。

どのようにすべての画面濃度で同じサイズで作成しますか?その後、(名前を変更することができます)

<!-- file: /res/values/dimentions.xml (you can rename the file) --> 
<resources> 
    <dimen name="circle_radius">24dp</dimen> 
</resources> 

そして、あなたはmakeBubbleこれを行うにこの関数を呼び出すどこ:

答えて

1

それがXMLの寸法を定義して行うための最善の方法

int radius = context.getResources().getDimensionPixelSize(R.dimen.circle_radius); 
makeBubble(radius, color) 

することができますActivity、Fragment、Viewからコンテキストやリソースを取得して、おそらくこれらのいずれかを得ることができます。エッジ条件でいくつかの問題を引き起こすアプリケーションコンテキストを使用しないでください。

更新:あなたのコメントの後

、あなたはプログラムで値を計算する必要があるように見えます。ただ、ここでそれを行う方法ですDisplayMetrics.density

して半径を掛け:この関数を呼び出す前に

DisplayMetrics metrics = getResources().getDisplayMetrics(); 
int radius = ...; // original calculation 
radius *= metrics.density; // now this is adjusted for screen density 

Here's the documentation

+0

私は半径を計算する(半径は任意の値ではなく、事前に定義することができます)ので、私はすることができますリソースに設定された値を使用しません。 – mbacvanski

+0

どのように半径を計算しますか?何に基づいて? –

+0

半径は別の要素に基づいて計算されますが、私の実際の質問は、2つのデバイスで同じ半径を指定すると、描画されるビットマップが画面の密度にかかわらず同じ物理サイズになることを確認することです。 – mbacvanski

関連する問題