2013年12月3日火曜日

アプリ紹介動画を作っていただきましたー

Androiderさんにアプリの紹介動画を作っていただきましたー

スマホで簡単ガーデンプランニング! 庭師

これしかし、なんとも言えず、すごく嬉しいですね

2013年11月14日木曜日

Androidアプリのレビューサイトの依頼先(国内) まとめ 最新版

以前Androidアプリのレビューサイトの依頼先をまとめましたが、 今回新作アプリ「庭師」をレビューしていただきたくまた調べなおしたので一覧を更新しました。

国内のレビューサイトはほとんど網羅しているかと思います。

たくさん掲載されるといいのですが…

サイト名依頼方法備考
APPREVIEWフォーム
OCTOBAフォーム
andronaviフォーム
meetroidメールテンプレ有
ドロイドバンクフォーム有料掲載有
オールアプリフォーム
gooスマホ部メール
アンドロックメール
アプリオメール
AppVipフォーム画像アップロード有
AppLabフォーム
アプリゲットフォーム画像アップロード有
アプリスタメール
Favroidフォーム有料掲載有
アンドロイドールフォーム女子向け 有料掲載有
アプリソムリエフォーム画像アップロード有
AppWomanフォーム女子向け
アンドロJapanメール
TABROIDメール
萌えドロイドメール萌え系
App DIMEメール
ファミ通Appメールゲーム
MobileASCIIメール
smapli(スマプリ)フォーム
Ketchapp!メールテンプレ有、有料有
アンドロイド・ゲームズメールゲーム
AppRoidフォーム
Grappsメール
スマートフォンナビフォーム
アプリパーティフォーム
GAPSISメール
子どもアプリナビフォーム子供向け
あんどろいどスマートフォーム

2013年11月9日土曜日

ガーデンプランニング Androidアプリ 「庭師」 アイテム紹介

写真をベースにいろんなアイテムを追加してガーデニングのシミュレーションが出来る新作アプリ「庭師」では全50種類もの植栽、グラウンド、フェンスアイテムがあります。
これからも随時追加予定ですが、一部紹介します。

2013年11月7日木曜日

スマホで簡単ガーデンプラン作成アプリ 「庭師」 リリース

スマホで簡単にガーデニングのプランを作成できるアプリ 「庭師」 をリリースしました。

使い方は簡単!
まず背景にしたい写真を選んでセットしてから好きな樹木やタイル、フェンスなどを配置するだけ!
気に入ったプランが出来たら、画像で出力してTwitterなどにも送れます

2013年8月13日火曜日

同じ構成のレイアウトを別ファイルにしてincludeで使う

たまにリストにするような不定数ではないけど、同じようなView構成が続く画面レイアウトがあります。例えばこんなやつ
こんなときはまず繰り返す部分のみのxmlファイルを作ります。
child.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">
  <TextView
      android:id= "@+id/title"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text= "Title"/>
  <LinearLayout
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="名前:"/>
    <EditText
        android:id="@+id/name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
  </LinearLayout>
  <LinearLayout
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="性別:"/>
    <EditText
        android:id="@+id/gender"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight= "1"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" 年齢:"/>
    <EditText
        android:id="@+id/age"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight= "1"/>
  </LinearLayout>
</LinearLayout>
そしてそのxmlをincludeして画面を作ります。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >
    <include layout="@layout/child" android:id="@+id/menber1"/>
    <include layout="@layout/child" android:id="@+id/menber2"/>
    <include layout="@layout/child" android:id="@+id/menber3"/>
</LinearLayout>
各includeに同名のidのViewが出来るので、アクセスする場合には必ず親を指定してからアクセスします。
((TextView)findViewById(R.id.menber1).findViewById(R.id.title)).setText("班長");
((TextView)findViewById(R.id.menber2).findViewById(R.id.title)).setText("メンバーA");
((TextView)findViewById(R.id.menber3).findViewById(R.id.title)).setText("メンバーB");
こういう変化しない内容はxmlに書きたいところですが、残念ながらinclude内のViewにはコードでしかアクセスできません。

2013年8月7日水曜日

Googleウォレットに税務情報を入力してください

久々にGoogleウォレットを見てみたら税務情報を入力してくださいと出てました
支払いを受け取るには更新が必要みたいなんでこちらを押して入力してみることにします
拙い英語力でやったのであってるかどうか、ここ見てやる人は参考程度にしておいてください
すると何も送信されませんでした(そりゃそうだ)と出たんで税務情報の送信を押します
アメリカに住んでるのか?アメリカの企業か?みたいなことを聞かれるんでNo!で次へ
国を選択して、住所は登録したのが自動で入ってるんで違ってたら入力、あと下の該当するのを選べ的なのがあるんで個人ならindividualを選択
あとは下のほうで署名して送信
これで完了のようです

2013年7月29日月曜日

2013年7月23日火曜日

Androidアプリのプロモーションに最適なモックアップ作成サービス

Googleからアプリのプロモーション用にぴったりのモックアップ作成サービスがあったので紹介します。
Device Art Generator
http://developer.android.com/intl/ja/distribute/promote/device-art.html

使い方は簡単、まずリストにある端末に応じた解像度のスクリーンショットを用意します。
そして作った画像ファイルをサイトの対象の端末の上にドロップするだけ


少し待てば出来上がり。


オプションで影と反射の有り無しと端末の縦横を変更できます。



こんな感じで使うといいかも?

2013年7月18日木曜日

Spinnerの項目を文字列で選択したい

spinnerの項目をプログラムで選択するにはSpinner.setSelectionを使いますが、これの引数がsetSelection(int position)となっていて文字列では選択できません
setTextなんかで入れれば自動的にリストにある同名の項目が選択状態になればいいのになあ、ということで作ってみました。

    public static void setSelection(Spinner spinner, String item) {
        SpinnerAdapter adapter = spinner.getAdapter();
        int index = 0;
        for (int i = 0; i < adapter.getCount(); i++) {
            if (adapter.getItem(i).equals(item)) {
                index = i; break;
            }
        }
        spinner.setSelection(index);
    }

他spinnerにはこんな落とし穴もあるので注意
Spinnerのバグでハマる
http://team-pag.interprism.co.jp/member/noguchi/blog/2010/11/Spinnerのバグでハマる

2013年7月17日水曜日

Androidのcanvasに描画したイメージを画像ファイルで保存する

アプリの中でcanvasに描画したイメージを画像として保存するという機能を付けたくなることがありますが、こんな感じで簡単に出力できます。

    //保存用Bitmap準備
    Bitmap image = Bitmap.createBitmap(640, 480, Config.ARGB_8888);
    //新しいcanvasに保存用Bitmapをセット
    Canvas canvas = new Canvas(image);
    //canvasに対して描画
    try {
        //出力ファイルを準備
        FileOutputStream fos = new FileOutputStream(new File("sample.png"));
        //PNG形式で出力
        image.compress(CompressFormat.PNG, 100, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
image.compressの部分は
public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream)
というような仕様になってますので、必要に応じてFormatをCompressFormat.JPEGに変えたりqualityの部分は0-100間で指定してください。

2013年7月9日火曜日

Playストアへのバッジ(リンク)ジェネレータ Google Play Badges

アプリ公開後に自分のブログやFacebookなんかに、公開したアプリのPlayストアへのリンク(バッジ)を貼ることがあるかと思います。こんな風に…


今まで適当に拾ってきた画像にリンクを設定していたんですが、Google公式のバッジジェネレータがありました。
Google Play Badges
http://developer.android.com/intl/ja/distribute/googleplay/promote/badges.html

使い方は簡単、言語、パッケージ名と好きな画像を選んでBuild my badgeを押すだけ。
あとは出来たhtmlをコピーして好きなように使ってください。


2013年7月4日木曜日

AndroidでString.Joinしたいので自作

Android(Java)にはsplitはあるのにどうやらjoinはないようで、データの保存や送信なんかで使いたい場合もあるので作っておきます。

    public static String join(String[] list, String with) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < list.length; i++) {
         if (i != 0) { buf.append(with);}
            buf.append(list[i]);
        }
        return buf.toString();
    }

    public static String join(ArrayList<String> list, String with) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < list.size(); i++) {
            if (i != 0) { buf.append(with);}
            buf.append(list.get(i));
        }
        return buf.toString();
    }

最近は配列よりもArrayListを使う機会のほうが多いので、ArrayList<String>を引数にするのも作りました。ArrayList<Integer>を引数にするのとか、いろいろバリエーションがあっても便利かもしれませんね。
nullチェックは入れていないのでお気を付けください。

2013年7月3日水曜日

Androidで画像をきれいに縮小して描画する

Androidでは様々な解像度の画面に対応するので、それに応じて画像を縮小して描画しています。
拙作Factoryでボタンを描画する際、普通にdrawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)で描画してみるとちょっと我慢ならない感じだったので、いろいろと試してみました。

試したパターンはPaintsetAntiAliasのあるなし、setFilterBitmapのあるなしとMatrix.postScaleによる縮小です。


結果としてはAntiAliasは画像の縮小には関係ないようで、drawLinedrawPath,drawCircleで効いてくるパラメータかと思います。
setFilterBitmap(true)とMatrix.postScaleによる縮小の結果はほぼ同じで通常であればsetFilterBitmap(true)で事足りそうです。

こちらの投稿ではMatrix.postScaleで何段階かにわけて縮小することで、さらにきれいにする手法が出ています。場合によってはこの手法を取り入れる必要があるかもしれません。
日本Androidの会 >画像をきれいに縮小する方法

2013年7月2日火曜日

Androidアプリ不具合修正の強い味方 リモートテストサービス

先日、間取りー図の高密度解像度端末で起こる不具合を修正しましたが、 レビューで不具合を報告していただいた方の端末がわかったことと、知り合いにその端末の所有者がいたことから運良く原因を突き止めることが出来ました。

しかしいつもうまく行くとは限らず、全てのAndroid端末で試してみることも簡単には行うことはできません。
そんな時に非常に助かるのがリモートテストサービスです。
リモートテストサービスではサービス側で用意している多くのAndroid端末を、インターネットを経由してリモートでテストをすることが出来るサービスです。
実機ですので不具合が出ている端末と同じ端末でテストできれば、不具合の再現、原因究明、修正効率がかなり上がることでしょう。
二つほどそのようなサービスを見つけたので紹介します。

androidアプリ開発者のための実機検証サービス  Developers AppKitBox
対応機種数: 全95機種(2013/06/25時点)
利用料金:お試し端末 無料
       全ての端末  1時間   945円
       全ての端末  10時間  9,450円
       全ての端末  50時間 42,000円
       全ての端末 100時間 78,750円

Scirocco Cloud
http://www.scirocco-cloud.com/ja/price.html
対応機種数: 100機種以上(2013/07/02時点)
利用料金:お試し端末(6機種 1時間/日) 無料
       全ての端末  5時間   4,200円
       全ての端末  18時間 12,600円
       全ての端末  38時間 25,200円
       全ての端末   1ヶ月  18,900円 

いざというときのために…

2013年7月1日月曜日

Androidでの間取り作成アプリのまとめ

拙作間取りー図を企画した時に競合するアプリを調査したのですが、その時は見つからずこれはもしかしてAndroid史上初の間取り作成アプリか!?と思ったのを記憶しています。
あとあと調べると、どうやら海外の競合アプリがいくつか出ていたようです…
参考までに同種のアプリをまとめてみました。

Floor Plan Creator (無料) 
https://play.google.com/store/apps/details?id=pl.planmieszkania.android
かなりの高機能なアプリ、手書きやカメラの映像からも間取りが作れます

AutoCAD WS (無料)
https://play.google.com/store/apps/details?id=com.autodesk.autocadws
有名なCADソフトのAndroid版

Inard Floor Plan (無料)
https://play.google.com/store/apps/details?id=se.inard.fp
CAD系、Image・PDF・DXF出力が可能のようです。

Blumatica RILIEVI mobile (無料)
https://play.google.com/store/apps/details?id=blumatica.rilievimobile
CAD系、DXF出力が可能のようです。

WizPlan FREE (無料)
https://play.google.com/store/apps/details?id=com.brainspool.bwizplanfree
フリーハンドで描けるお絵かきモードのようなものがあるようです。

間取り+ (315円)
https://play.google.com/store/apps/details?id=air.jp.co.magic_hour.roomplus
間取りの作成に特化したアプリ建具や家具など100点以上のパーツがあるようです。
こちらはiPhone版もある模様。

同種のアプリは操作や機能面などいろいろと見習いたい所がありますね。

2013年6月28日金曜日

Android搭載端末の調査に便利なサイト まとめ

Androidアプリの作成では様々な端末への対応を考慮しなければなりません。
現在どのような端末が出てるのか、調査に便利なサイトをまとめてみました。

まずはこちら、Google公式?のAndroid Device Galleryです。
かなりの数の端末が登録されていて国やキャリア、OS等の条件で検索できます。かなりの数なのでGoogle Playストアで承認されている端末が全部あるのかなと思いましたが、そこまでではないようです。
端末ごとにCPU・Camera・Display・OS Version・Storage and Memory・Battery・Connectivity等のかなり詳しい情報も見ることが出来ます。
Android Device Gallery
http://www.android.com/devices/

次はこちらWikipediaのAndroid端末一覧ページです。
2009年のHT-03Aから始まって、発売日順にメーカー・形状・OSバージョン・キャリア等を一覧で見ることが出来ます。
Android端末一覧
http://ja.wikipedia.org/wiki/Android%E7%AB%AF%E6%9C%AB%E4%B8%80%E8%A6%A7

次はスマートフォンデータベースです。
スマートフォン231機種のスペックをキャリア・メーカー・OSバージョン・性能・機能等の条件を指定して一覧で見ることが出来ます。
スマートフォンデータベース
http://smartphone.ultra-zone.net/

次は国内主要キャリアの端末を一覧でまとめているDevelopers AppKitBoxのサイトです。
キャリアごとにメーカー・OSバージョン・解像度・CPU等を一覧で見ることが出来ます。
Developers AppKitBox
Docomo
http://appkitbox.com/knowledge/android/2012/11/12/docomo-smartphone
AU
http://appkitbox.com/knowledge/android/2012/11/12/au-smartphone
Softbank
http://appkitbox.com/knowledge/android/2012/11/12/sb-smartphone
その他
http://appkitbox.com/knowledge/android/2012/11/12/other-smartphone

最後は主に画面のサイズ、解像度等を一覧で見ることが出来るSCREEN SIZ.ESというサイトです。
こちらの特徴として、独自の方法で計算された指標ではありますがpopularityとういう項目で端末の人気度を見ることが出来ます。
SCREEN SIZ.ES
http://screensiz.es/

以上参考までに。

2013年6月26日水曜日

間取りー図が5万ダウンロードを達成しましたー

このたび間取りー図が5万ダウンロードを達成しましたー。
これもひとえにダウンロードしていただいたユーザーの皆様のおかげです。
公開開始が2012年11月6日でしたので、約7か月半での達成となりました。


この間10回程のバージョンアップを行いました。ユーザーからの不具合報告や要望はありがたい限りです。
国別でみると日本が66.84%、アメリカ7.4%、他25.76%と意外に海外の方も利用して頂いているようです。Feet単位に対応してほしいなどの要望もあったのでVersion 1.2.0で対応したりもしました。

今後も機能追加や改善に励みたいと思いますので、よろしくお願いいたします。

2013年6月25日火曜日

dimen.xmlからのdip指定によるgetDimensionの落とし穴

使い方を間違っているだけなのに落とし穴と書いてると怒られそうですが、昨日修正を公開した間取りー図での不具合は、リソースのdimen.xmlでdip単位で書いてある値をSurfaceViewのボタンの大きさ指定に使っているのですが、ここで間違った計算をしているのが原因でした。

最近間取りー図のユーザーレビューで
ボタンが見切れてほとんど使えない
5インチフルHDの画面なんだけど、各種ボタン(+-や反転等の)の大きさが極端に合ってない
という報告が上がってきていて、ボタンはdipの値から計算してサイズ設定しているからそんなはずはないんだけどなぁと思いながら、対象の実機で確認してみると本来は


こうなるべきところが
と報告と同じくえらいでかいサイズになってしまっていました。
原因を探ってみたところ、どうやらxxhdpi(超高解像度)の端末で、このような現象になっている模様。
リソースでの指定は
  <dimen name="button_width">48dp</dimen>

こんな感じ、この値をプログラムでは
int bw = (int)(context.getResources().getDimension(R.dimen.button_width) * context.getResources().getDisplayMetrics().density + 0.5f);

このように値を取得・計算して、最終的にピクセル単位にしてボタンを描画していました。
要はこの計算が間違っていたのですが、どうやらgetDimensionはanyDensityがtrueの場合DisplayMetricsで単位変換されるということのようです。

つまり私はgetDimensionですでに単位変換されている値を、更に単位変換してしまっているので、xxhdpiの場合getDimensionでもとの3倍、それをさらに3倍しているということでした。
あまりこのような使い方をしてる人はいないかもしれませんが、お気を付けて…

参考:【教えてください】TextView等のテキストサイズについて
参考:Converting dp units to pixel units

2013年6月24日月曜日

"間取りー図"のバージョンアップを公開しました。

"間取りー図"、"間取りー図 Pro"のバージョン 1.2.2を公開しました。
修正点は一部の端末(Xperia Z、Garaxy S4等)において図形操作ボタンが大きすぎて、画面に表示しきれない問題を修正しました。
対象の方々にご迷惑をおかけしましたこと、この場を借りてお詫び申し上げます。

2013年6月21日金曜日

自作ライブラリ-SurfaceViewで画像の数字を表示

Androidアプリ・ゲームを作るときに、スコアやパラメータなど数字を表示したい場合が結構あります。
こんなときCanvas#drawText()で済めばいいんですが、見た目にこだわりたいときは画像を使う他ありません。 
やることは数字の画像を0から9まで用意して各桁の数字に合わせて位置を決めて描画するというだけですが、何回もでてくるので汎用的なクラスにしてしまったほうがいいかなということで作ってみました。 
まず0から9までの画像を用意。


表示用のクラスはこんな感じ

public class CvsNumber {
    public Rect res;
    public Bitmap[] images = null;
    public int number = 0;
    public int digit = 3;
    public boolean zerofill = false;
    public int top;
    public int left;
    public int width;
    public int height;
    public Paint paint = new Paint();
    private Rect src;

    public CvsNumber(int id, Context context, int[] resources) {
        images = new Bitmap[10];
        //0から9の画像をセット
        for (int i = 0; i < 10; i++) {
            images[i] = BitmapFactory.decodeResource(context.getResources(), resources[i]);
        }
        //1つ目の画像の大きさを取っておく
        src = new Rect(0, 0, images[0].getWidth(), images[0].getHeight());
    }

    public void draw(Canvas canvas) {
        int r = left + width; //描画範囲の右端
        int w = width / digit; //1桁当たりの描画幅
        int h = (w * images[0].getHeight()) / images[0].getWidth(); //1桁当たりの数字の描画高さ
        int t = top + ((height - h) / 2); //描画開始高さ
        int s = number % 10; //1の位の数字
        //1の位を描画
        canvas.drawBitmap(images[s], src, new Rect(r - (w * 1), t, r, t + h), paint);
        //digitで指定した位まで描画
        for (int i = 1; i < digit; i++) {
            if (zerofill || String.valueOf(number).length() > i) {
                s = (number / (int)(Math.pow(10, i))) % 10;
                canvas.drawBitmap(images[s], src, new Rect(r - (w * (i + 1)), t, r - (w * i), t + h), paint);
            }
        }
    }
}

表示結果はこんな感じ。
与えるパラメータは描画位置のtop,left,width,heightとnumber(値),digit(桁数),zerofill(0埋め)です。
 
四角い枠は指定した描画範囲をわかりやすいように表示してます。

一度作っておけば画像を差し替えれば、いろんなパターンで利用できて捗ること間違いなしです。
SurfaceViewに限らず自作Viewでも利用可能ですね。 

2013年6月19日水曜日

Androidアプリでデータをファイルで保存したい

Androidアプリでデータをファイルに保存したいことがあります。
ものによってはデータベースを使う方がいい場合もありますが、単体で出力したい場合に便利なのがシリアライズ。 データを1つのSerializableなクラスインスタンスにまとめておけばObjectOutputStream.writeObjectで簡単にファイルにすることが出来ます。
シリアライズのすごいところはそのクラスのフィールドがSerializableなクラスで構成されている場合には、出力コードを何にも書かなくていいんです。
たとえSerializableではないクラスがあったとしても、そこだけ自分で出力するかSerializableクラスに置き換えるだけでいいんです。

//データクラス
class S implements Serializable {
    private static final long serialVersionUID = 1L;
    public int id;
    public String name;
    public boolean visible;
    public S(int id) {
        this.id = id;
    }
}
//出力
S data = new S(1);
FileOutputStream fos = context.openFileOutput(filepath, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
//読込
FileInputStream fis = new FileInputStream(filepath);
ObjectInputStream ois = new ObjectInputStream(fis);
S data = (S)ois.readObject();
ois.close();
ファイルを読み込むときもObjectInputStream.readObjectで開いてキャストするだけで復元できます。 ただし、シリアライズではこんな落とし穴こんな注意点もありますので、お気をつけて…

2013年6月18日火曜日

SurfaceViewでの画像のタイル描画(繰り返し)

SurfaceViewを扱うとき背景のところを1枚絵で描画しているときはいいですが、小さい画像の繰り返しで済むような場合は、リソースの節約のためにもタイル(繰り返し)描画をしたほうがいいかと思います
ロジック的には下のような感じ、while分の中で描画したい大きさに達するまで位置を変えて繰り返し描くだけです。

//描画領域Rect
Rect r = new Rect(left, top, left + width, top + height);
//画像幅取得
int imgWidth = background.getWidth();
//画像高さ取得
int imgHeight = background.getHeight();
switch (layout) {
case BACK_FIT : //領域全体
    canvas.drawBitmap(background, imgRect, new Rect(r.left, r.top, r.width(), r.height()), paint);
    break;
case BACK_VREPEAT : //縦の繰り返し
    int sh = 0;
    while (sh < height) {
        canvas.drawBitmap(background, imgRect, new Rect(r.left, r.top + sh, r.width(), imgHeight), paint);
        sh += imgHeight; //画像の高さ分足す
    }
    break;
case BACK_HREPEAT : //横の繰り返し
    int sw = 0;
    while (sw < width) {
        canvas.drawBitmap(background, imgRect, new Rect(r.left + sw, r.top, imgWidth, r.height()), paint);
        sw += imgWidth; //画像の幅分足す
    }
    break;
}

最後の描画で描画領域を考慮していないのではみ出すことがありますが、それで困る場合は先日書いたSurfaceViewで描画範囲を限定するを利用するとよいでしょう。

2013年6月17日月曜日

AndroidのSerializableクラスでのtransient指定の落とし穴

Androidのと付けましたがJava全般の話ですね。
先日Serializableなクラスを継承したクラスの落とし穴という話を書きましたが、またしてもSerializeではまってしまいました。
落とし穴というか自分が無知だっただけなんですが、Serializableクラスでフィールドへtransient指定した場合、宣言と同時に値を入れていてもデシリアライズ時には反映されません。
具体的にはこんな感じ

class S implements Serializable {
    public final int x;
    public transient int t = 20;
    public S(int x) {
        this.x = x;
    }
    public String toString() { return "X=" + x + ",T=" + t; }
}

S s = new S(400);
oout.writeObject(s);
Log.v("LOG", (s + ":オブジェクトを書き込みました"));
ObjectInputStream oinp = new ObjectInputStream(finp);
Log.v("LOG", (oinp.readObject() + ":オブジェクトを読み込みました"));

[結果]
06-18 16:26:18.990: V/N(21976): X=400,T=20:オブジェクトを書き込みました
06-18 16:26:18.990: V/N(21976): X=400,T=0:オブジェクトを読み込みました

初期値で与えているt=20が反映されていません。
デシリアライズ時はコンストラクタも通りませんので気を付けましょう。

2013年6月14日金曜日

Factoryがアプリゲットでレビューされていました

全然気づいていなかったんですが、なんとなく検索してみたらFactoryが5月22日にアプリゲット様で今日のおしゲー「ゲームウォッチ風単純ゲーム」という感じでレビューしていただいてました。

  ありがとうございました。

2013年6月13日木曜日

SurfaceViewで描画範囲を限定する

SurfaceViewは描画時の座標指定で画面をはみ出して指定しても、きちんとその指定で描いてくれるので、普段はみ出し部分を気にしたりしないんですが、
今作っている新作アプリで1枚のSurfaceViewを上下に分けて使っているところがあって、いつも通りやってたら上の部分の描画が下の所にはみ出してしまう…
上の画面では等間隔のグリッドを透視投影して描いてる(赤い部分)んですが、下のほうがはみ出してしまっています。
こんなときは描画範囲を限定したい描画のところでCanvas.clipRect(Rect rect)するといいようです。
//限定したい範囲のRect作成
Rect clip = new Rect(0, 0, 640, 320);
canvas.save();
canvas.clipRect(clip);
//描画範囲限定の描画処理

canvas.restore();
ソースはこんな感じ。 
clipRectの指定が限定したくない描画に影響しないように、clipRectする前にcanvas.save()、終わった後にcanvas.restore()するのを忘れないようにしましょう。
結果はこんな感じ。
ちゃんとはみ出し部分が消えています。

2013年6月10日月曜日

AndroidでSerializableなクラスを継承したクラスの落とし穴

なんかよくわからんタイトルになってしまいましたが、Serializableなクラスを継承したクラスはSerializableをimplementsしなくてもSerializeすることができます。

public class S implements Serializable {
  private static final long serialVersionUID = 6105608118246672383L;
}

public class Hoge extends S {
  //serialVersionUIDなし、SをextendsしてるのでSerializeはできる
}

ところがこの継承したクラスはserialVersionUIDがないため、コンパイラが自動生成したserialVersionUIDを与えてしまうのです。
そうなると継承クラスをちょっと変えようものなら、変更前にSerializableしたファイルはserialVersionUIDが違うためInvalidClassExceptionを起こしてしまいます。
そうならないために、serialVersionUIDをきちんとつける習慣をつけましょう。
Serializableは拍子抜けするほど簡単にクラスをファイルに落とすことが出来て大変便利なんですが、適当に使うと大変な目にあいますね。
後々の変更も検討してよく考えて使いましょう。この辺もよく読んでおくといいかも。

Serializationの実装
http://book.geocities.jp/bits_of_java/java/io/serializable/index.html#contents

Java セキュアコーディングスタンダード CERT/Oracle 版 シリアライズ (SER)
https://www.jpcert.or.jp/java-rules/#c13

2013年6月4日火曜日

Factoryがアンドロイダー公認アプリに、そしてデイリーランク2位に!

拙作Factoryがアンドロイダー公認アプリになりました。
 そしてなんと、デイリーランキングで2位に!
 こ、これは本当か!?これで勢いが出たらいいなぁー

2013年6月3日月曜日

間取りー図がSony Selectでレビューされましたー

間取りー図Sony Selectでレビューされましたー


間取りー図は公開したのは半年以上前ですが、同アプリが4月に雑誌掲載して頂いたことといい、ツール系のアプリは息が長いのが特徴ですね。

2013年5月27日月曜日

自作ライブラリ-SurfaceViewで表示するボタン

SurfaceViewでボタンを使いたくなった場合、FrameLayoutあたりを使ってButtonを重ね表示して、onClickイベントで処理するということもできますが、自前でSurfaceViewに描画するButtonクラスを作っておくと、いろいろと柔軟に対応できて捗ります。
まず対応する状態に応じた画像を準備します。

Buttonクラスはこんな感じで、状態とそれに応じたImageを持っていて描画メソッドでは状態に応じて画像を描画します。
public class CvsButton {
  public Paint paint = new Paint();
  public boolean enabled = true;
  public boolean pressed = false;
  public boolean visible = true;
  public Bitmap defaultImage;
  public Bitmap pressedImage;
  public Bitmap disenableImage;
  public Rect rect;

  public CvsButton() {}

  public CvsButton(Resources resouce, int defaultId, int pressedId, int disenableId, Rect size) {
    defaultImage = BitmapFactory.decodeResource(resouce, defaultId);
    pressedImage = BitmapFactory.decodeResource(resouce, pressedId);
    disenableImage = BitmapFactory.decodeResource(resouce, disenableId);
    rect = size;
  }

  public void draw(Canvas canvas) {
    if (enabled) {
      if (pressed) {
        canvas.drawBitmap(pressedImage, rect, rect, paint);
      } else {
        canvas.drawBitmap(defaultImage, rect, rect, paint);
      }
    } else {
      canvas.drawBitmap(disenableImage, rect, rect, paint);
    }
  }
}
このクラスをSparseArrayかHashMapあたりに突っ込んで、SurfaceViewのonTouchEventで座標をisPressに流してボタンのイベント処理、描画スレッドでdrawメソッドを呼んでボタンの描画処理を行います。

  public static final int BUTTON_A = 1;
  public static final int BUTTON_B = 2;

  private SparseArray<CvsButton> items = new SparseArray<CvsButton>();

  public void init() {
    items.put(BUTTON_A, new CvsButton());
    items.put(BUTTON_B, new CvsButton());
  }

  public int isPress(int x, int y) {
    int ret = -1;
    for (int i = 0; i < items.size(); i++) {
      if (items.valueAt(i).rect.contains(x, y) && items.valueAt(i).visible && items.valueAt(i).enabled) {
        items.valueAt(i).pressed = true;
        ret = items.keyAt(i);
        break;
      }
    }
    return ret;
  }

  public void draw(Canvas canvas) {
    for (int i = 0; i < items.size(); i++) {
      if (items.valueAt(i).visible) { items.valueAt(i).draw(canvas);}
    }
  }

一度作っておけば、使いやすいよう改変したりしていろんなところで使えるので大変お勧めです。

2013年5月22日水曜日

ついにキタコレ!Unityモバイル向け機能を完全無償化

Unity, iOS と Android を含む個人・小規模開発者向けのモバイル向け機能を完全無償化
http://japan.unity3d.com/blog/press/?p=408&preview=true

Unityとはユニティ・テクノロジーズが開発している統合開発環境をもったゲームエンジンで、多様なプラットフォームに対応している。
有名どころではけり姫クエストなんかにも採用されています。

去年の4月ごろ期間限定の無料キャンペーンをやっていたUnityですが、この時ゲットし損ねたのを悔やんで悶々としておりました。

それがついに!完全無償化とはいやはや太っ腹です。これで今までやっていなかった3Dを駆使したアプリなんかにも挑戦してみたいですね。

2013年5月20日月曜日

Androidでのオンラインランキングのど本命「Google Play game services」

アプリにオンラインランキング、実績サービスを組み込むことが出来る「Google Play game services」が発表されました。
ランキングと実績に加えてユーザー同士をマッチングする、マルチプレイの機能も用意とのこと。

以前オンラインランキングを考えていて、自分でサーバーを用意するかサービスとして提供しているものを利用するか検討したことがありました。その時出てきたのは大体こんなところ。

hamon夫婦で交換日記: OpenFeintの代わりに使えそうなサービス一覧
OpenFeintというのはモバイルゲーム向けのプラットフォームでオンラインランキングやソーシャル的な要素を組み込むためのサービス。
2010年時点で1000万ユーザーを獲得していましたが、2012年末にGREEに買収されてしまいました。

http://pankia.com/
パンキアは目標を達成することでトロフィーを集める「アチーブメント」、スコアを投稿してランキングをつける「リーダーボード」等を提供しているプラットフォーム。
ネットワーク対戦を実装するための簡単なインターフェースもあります。

上記のサービス利用にはユーザーのアカウント登録が必要なのが多かったりして、結局どれもまだ利用していませんでしたが、今回Googleからこのようなサービスが出るとなれば利用しない手はないかもしれません。

2013年5月16日木曜日

SurfaceViewでの複数解像度に対応した画面設計

Androidでは多様な端末が存在しており、解像度も縦横比も異なるさまざまな画面に対応しなければなりません。
これに対処するには用途に応じて画面に対する比率で大きさを決める部分、縦横比を固定する部分、引き伸ばしてもいい部分というように分割して考える必要があります。
例えば拙作のFactoryではこのような分割をして画面を設計しました。



画面に対して上下を55:45に分けて液晶描画とボタン描画部にとっています。
上部分の液晶表示部は横を全体width90%としていますが、縦横比は変えたくない部分なので縦はそれに対しての77%にしています。
この設計でいくとXperia Z、LG L-06D、初代Xperia SO-01Bなどでは以下のような実寸になります。
 
改めて計算してみると数あるAndroidスマートフォンの中でも、おそらく最も縦横比の縦が短いと思われるJOJO携帯ことLG L-06Dですが、上下分割の上の部分494pxに対して液晶表示枠の縦が768×0.9.×0.77=532pxになっていてはみ出してしまっています。
今頃気づいたんですがこれは完全に設計ミスですね
LG L-06Dユーザーの方ごめんなさい。

2013年5月15日水曜日

レトロではまる新作アプリ「Factory」公開

某コンテストに出したけど特に何もなく終わったゲームなんですが、個人的にこのゲームはなかなかゲームルールとゲームバランスの調整がよくできたと思ってます。自分で言うなという感じですが…
そのままお蔵入りではもったいないので、キャラクターを変えたりして公開することにしました。
よかったら遊んでみてください。







2013年5月2日木曜日

setColorとsetAlphaで半透過描画した時の落とし穴

こんなのにはまるのは自分だけかもしれませんが、半透過の描画をしようとしてはまってしまったので書いておきます。
描画時に透過したい場合setAlphaを使ったりしますが、このときsetColorとの組み合わせに注意しなければなりません。
例えば赤い半透明の丸を書いて、その横に青い半透明の丸を書きたいなんて時

Paint paint = new Paint();
paint.setColor(linecolor);
paint.setStyle(Style.FILL);
//描画色_赤指定
paint.setColor(Color.RED);
//半透過指定
paint.setAlpha(128);
//丸描画
canvas.drawCircle(40, 40, 40f, paint);
//描画色_青指定
paint.setColor(Color.BLUE);
//丸描画
canvas.drawCircle(120, 40, 40f, paint);

と書いてしまうとこうなります。
青い丸が透過していません。なぜかというとsetColorリファレンスをよく見ると、The new color (including alpha)と書いてある通り透過パラメータを含んでます。
Color.BLUEはColor.argb(255, 0, 0, 255)と値が同じなので、Color.BLUEをセットすると透過なしになってしまいます。
なのでこの場合、setColor後に再度setAlpha(128)をするかsetColor(Color.argb(128, 0, 0, 255))にすると
このように意図したとおりになります。
リファレンスはちゃんと読もうということですよね…

2013年5月1日水曜日

PhotoRouletteアプリ公開1ヶ月 反省会

PhotoRouletteを公開してから1ヶ月あまりが経ちました。
現在までのダウンロードは以下のような感じ。
有効インストールは4/25時点で59、とこれは惨敗といっていい結果です…
レビューサイトでの掲載は恐らくミートロイド様での1件のみ。
残念でしたと言っても仕様がないので、敗因を探ってみます。
アプリの成功要因を需要・品質・インパクト・流行・プロモの5つで自己評価してみました。
 
アプリを使ってもらうためにはまず第1にGooglePlayでアプリを表示してもらうこと、次にアプリの説明、スクリーンショットを見てアプリをインストールしてもらうことの2つ関門があります。

GooglePlayで表示してもらうにはPlayのランキングか検索からのいわゆる自然流入とよばれるものと、レビューサイトの紹介、ブログ、twitter、Facebook等のメディア流入、あとは純広告、リワード広告、自社広告からの広告流入などでしょうか。
PhotoRouletteの場合この中で流入が期待できるのはレビューサイトくらいかなと思ってたので、 Androidアプリのレビューサイトの依頼先(国内) まとめで挙げたのを含め20サイトくらいにレビュー依頼をしました。しかし結果は1件で、残念ながらレビューサイトに載るには需要、インパクト、プロモーションが全然足りなかったと思われます。
もっと充実した質の高いアプリの紹介、スクリーンショットや画像、紹介動画の作成など力を入れておくべきでした。
そもそもアプリの出来が悪いのでは?という懸念もありますが、1ヶ月で総インストール160という数からして、アプリの出来以前にインストールもしてもらえてないということです。
特にプロモーション不足しているところを反省点にして次に生かしたいところです。

2013年4月30日火曜日

アプリのプロモーション動画の効果

アプリのプロモーションの一つとしてYoutubeでの動画の公開があります。
 
デベロッパーコンソールでもこのように
 
アプリのページに動画を設定する場所が用意されていてGoogle Playでも表示されるので、アプリを入れようとする人は見ることが多いと思われます。
動画のプロモーション効果として説明とスクリーンショットでは伝えきれないアプリの魅力を伝えることが出来ることと、アプリの操作方法をとてもわかりやすく伝えられることがあります。
アプリの魅力が伝わることはアプリのインストール数増加が見込まれるし、アプリの操作が理解されやすいことでアンインストール数を抑える効果があります。
実際拙作のEasyBowlingで公開当初アンインストール率が高く、動画を作って公開したところ

 アンインストール数総インストール数アンインストール率
動画公開前(3ヶ月)3841586765%
動画公開後(3ヶ月)78941654148%

動画公開後アンインストール率が目に見えて減りました。
このゲームが特に操作方法がわかりにくいというところもあると思いますが、それなりに効果があると思われます。

2013年4月29日月曜日

PhotoRouletteがミートロイドでレビューされましたー

PhotoRouletteミートロイドでレビューしていただきましたー。



Androidアプリのレビューサイトの依頼の成果がやっとでた感じです。
おそらく1件目のレビューとなります!ありがたいことです。