Androidでの単位変換系の覚書メモ

はじめに

毎回ググることが多いのでまとめメモを作っておく(あとで追記予定)

Latlng => Locationの変換

地図系のアプリを使っているとたまに必要になる

LatLng TOKYO = new LatLng(35.691, 139.693);

Location location = new Location(LocationManager.GPS_PROVIDER);
location.setLatitude(TOKYO.latitude);
location.setLongitude(TOKYO.longitude);

最後の位置情報をPrefrenceに保存するケース

NWが不順/オフラインな時、

  • GoogleAPIClientに接続できない
  • 現在地取得ができない
  • 一番最後の位置にとりあえず移動したい*1

な場合が多いのですが、

double型は保存できないので工夫しなさいよという話


byte[]<=>Bitmap置換

//byte[] => Bitmap
Bitmap bmp = null;
byte[] bytes = xxx; //ここに画像データが入っているものとする
if (bytes != null) {
  bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}

//Bitmap =>byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();

Drawable<=>Bitmap置換

//drawable => Bitmap
Bitmap bmp = ((BitmapDrawable) drawable).getBitmap();

//Bitmap =>drawable
Drawable drawable = new BitmapDrawable(bmp);
  • 9-patchの場合は
public Bitmap loadBitmap(Drawable drawable) {
        int width  = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        return loadBitmap(drawable, width, height);        
}

public Bitmap loadBitmap(Drawable drawable, int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//★
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, width, height);
    drawable.draw(canvas);
    return bitmap;
}

OpenGLとかで使う場合は、ARGB_8888が普通っぽいけど、javaベースならARGB_4444で十分かもしれない

でもまあ 9-patchの画像 自体提供されることが少なくなっている気がしますね*2

そもそも9-patchの画像の作り方を知らないデザイナーさんが未だにお多い。*3

下記みたいにプログラマーが用意するべきものみたいな認識があるかも*4

まあ tools 25.3.0 から draw9patch は廃止されていたりするので、今後廃れていくフォーマットなのかもしれない・・

WebP対応に関して思うこと

WebPとかも iOS側で使ってくれないとデザイナーさんの素材作成的にサポートされない予感がする・・*5


Viewのキャプチャ

  • 単純なImageView
Bitmap bmp = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
  • 普通のViewなら
public Bitmap getViewCapture(View view) {  
    view.setDrawingCacheEnabled(true);  
  
    // Viewのキャッシュを取得  
    Bitmap cache = view.getDrawingCache();  
    if(cache==null) return null;
    Bitmap screenShot = Bitmap.createBitmap(cache);  
    view.setDrawingCacheEnabled(false);  
    return screenShot;  
}  

でもこれやりたいときって一番下のrootView(RelativeLayout)とかでやりたいわけだけど、うまく取れなかったりするんですよね・・仕方ないのかもしれませんが・・

関連

でAndroid5からは

MediaProjection API を使え という流れみたい

一応下記のフラグで黒画面表示でスクショブロックできるらしいが。。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

でこの機能を使ったソフトの話が下記に繋がると。

qiita.com


配列参照系

某所の参照引用なんですが、そのサイトの記載が微妙に間違っていて

そのままコピペ=>コンパイルエラーを繰り返しているので(苦笑

文字列配列

<string-array name="sample_names">
    <item>foo</item>
    <item>bar</item>
    <item>baz</item>
</string-array>
String[] names = getResources().getStringArray(R.array.sample_names);

int配列

<integer-array name="sample_ids">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</integer-array>
int[] ids = getResources().getIntegerArray(R.array.sample_ids);

その他配列系

<array name="sample_images">
    <item>@drawable/title</item>
    <item>@drawable/logo</item>
    <item>@drawable/icon</item>
</array>

<array name="sample_colors">
    <item>#FFFF0000</item>
    <item>#FF00FF00</item>
    <item>#FF0000FF</item>
</array>
TypedArray images = getResources().obtainTypedArray(R.array.sample_images);
Drawable drawable = images.getDrawable(0);  //Drawable配列


TypedArray colors = getResources().obtainTypedArray(R.array.sample_colors);
int color = colors.getColor(0); //Color配列

独自のMap配列

使ってみてちょっと便利でした。


最近のAndroid Studio 2.4 Preview2 君

android界の有名な方が、release noteを呟くとRTがブクマツイートが ガンガン飛んでくる感じだったりしますが

皆さんさわってないんだろうなーというのが正直な感想・・

署名の件は調べたら OS7用の v2署名の話だったらしい。まあ OS7使ってないから確かに影響がわからんわな・・(苦笑

ステップデバック時にローカル値参照やevalが使えない件は、一見治ったようには見えるんだけど

InstantRunを2回目以降すると、ローカル値参照やevalができなくなる。preview3以降をお待ちしております状態かな

*1:デフォルトだと太平洋の真ん中とかになるのでorz

*2:素材自体もi/a共通というかi側のリソースがそのまま渡されることが多いので

*3:多分必要がないから覚える必要がない

*4:drawableのshape.xmlみたいな感じで。i側OSデフォルト素材は基本配布されないので

*5:大体運用で、デザイナーさんが納品した素材をそのまま使いましょうとかいう場合が多いですよね・・変換NG的な