カテゴリー: Android

お・ぼ・え・が・き (´-人-`)


Androidだと最初からカラー変換用のstaticメソッドがあるんだな(・∀・) ラクデイイ
Color.parseColor(String colorString)
android - How to get a Color from hexadecimal Color String


配列内にある数値が入ってなければ、追加するみたいなコードを書きたくてぐぐった。
JAVAの課題で困ってます。

Arrays.binarySearchというのが使えるのか(・∀・)と思って試していてはまった_| ̄|○
挙句の果てに当初の目的には使用出来なかった…__o_

if(binarySearch(array, value)==-1) 

みたいなコードで良いのかと思ったが、どうしても期待通りに動いてくれない。

ソースを見た。よくわからない(´・ω・`) エイゴヨムノメドイ

/**
     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
     * Searching in an unsorted array has an undefined result. It's also undefined which element
     * is found if there are multiple occurrences of the same element.
     *
     * @param array the sorted array to search.
     * @param startIndex the inclusive start index.
     * @param endIndex the exclusive start index.
     * @param value the element to find.
     * @return the non-negative index of the element, or a negative index which
     *         is {@code -index - 1} where the element would be inserted.
     * @throws IllegalArgumentException if {@code startIndex > endIndex}
     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
     * @since 1.6
     */
    public static int binarySearch(int[] array, int startIndex, int endIndex, int value) {
        checkBinarySearchBounds(startIndex, endIndex, array.length);
        int lo = startIndex;
        int hi = endIndex - 1;

        while (lo <= hi) {
            int mid = (lo + hi) >>> 1;
            int midVal = array[mid];

            if (midVal < value) {
                lo = mid + 1;
            } else if (midVal > value) {
                hi = mid - 1;
            } else {
                return mid;  // value found
            }
        }
        return ~lo;  // value not present
    }

~ってなんだよヽ(`Д´)ノと思ったら、「ビットごとのNOT演算(各ビットの反転)を行う。」
ということらしい。(Javaの道:演算子(5.ビット演算子))

ビット演算の理解はかなり低いのでデバッガで戻り値を見てみる。

-11(´・ω・`)?
なんじゃそりゃと思ってloの値までしっかり見てみると、
ビット演算前のloの値は「10」。「10」というのは配列の長さと一緒で、
それをNOT演算したから「-11」か。

最初は-(array.length+1)で判定するというアレな書き方をした。
後で~array.lengthで良いことに気づいた(ノ∀`)

取り敢えず期待通りの動きをした∩( ・ω・)∩ バンジャーイ
と喜んだのも束の間、更にぐぐってみて絶望のどん底に叩き落とされる。

java.util.Arrays.binarySearch で二分探索
binarySearchについて
を読んで気づいた。

ソースのコメントにもあるが戻り値は

@return the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
存在する場合は負ではない要素のインデックス、又は要素が挿入されるであろう、-位置-1である負のインデックス

ということであり、それは配列の内容と検索する値によって
戻り値が変わるということを意味する( ;・´ω・`)ゴクリッ
つまり期待していた使い方は出来ない…

返して、私の純情と数時間を返して。・゚・(ノД`)・゚・。

最終的にはTrueの場合のindexをArrayListに入れる形でやっつけたw


国際化ってどうすんだっけと自分の翻訳したものを読んだ。
珍しく役に立った(・∀・) 最初、values-jpにして読み取れずに悩んだのは内緒。
values-jaが正解だった(ノ∀`) ISOいくつかで決まってるリージョンコードだか
なんかだっけか。

様々な言語のサポート


デフォルトのフォントだと美しくないのでフォントの変更方法をぐぐる。
setTypeface()というメソッドで良いらしい。本来ならView等に直接指定をすれば
良いようだが、うちでは変態的なプログラミングをしているので、drawText()時の
引数であるPaintでsetTypeface()することにした。

でも考えてみるとフォントなんて何が入ってるかわからないけど、ユーザーに
選択させるのもなんなので同梱したフォントを指定する方法をぐぐる。

assetフォルダにあるフォントファイルを読みこめば良いらしい。
Android端末の組み込みフォント以外を使用する


フリーフォントをぐぐる。モトヤシーダ辺りが良さ気に見えたけど、
商用だと有料らしいのでパスした。商用で使うわけではないが何となく
面倒くさそうなものはパスや(・∀・)

結局自家製 Rounded M+をダウンロードして試した。
最初は「60MBってなんでそんなにでっかいんや(´・ω・`)」と思ったが、
マイナーな違いでフォントファイルが複数含まれているだけだった。
一つ辺りは3MB程度なので他のフォントファイルとほぼ同じ大きさだった。

一応フォントの変更は出来たけれども、なんかボタンサイズがおかしいw
2.3.3以降では正しく描画されるのに2.2だとおかしい。2.2の頃だと
元々の組み込みフォントじゃないとpaint.measureText()が正しく働かないのかな?
※2014-07-26追記 paint.getFontMetrics()だった(ノ∀`)

2.22.3.3

まあ2.2だったらsetTypeface()しないようにすればいいだけかな。


エミュレータのショートカットってctrl+F12しか知らんかった(ノ∀`)
Androidエミュレータのショートカットキー一覧

お・ぼ・え・が・き (´-人-`)

テキスト幅の取得

テキストの描画(FontMetrics)

【Android】SurfaceView上でCanvasに描画する文字列の幅を取得する

最初はreturn fontMetrics.descent-fontMetrics.ascent;にしてたけど、

bottom
The maximum distance below the baseline for the lowest glyph in the font at a given text size.

descent
The recommended distance below the baseline for singled spaced text.
Paint.FontMetrics | Android Developers

ということなのでfontMetrics.bottom-fontMetrics.top;にした。

こんな感じでいいのかな?

public float getTextWidth(String string){
	Paint paint = new Paint();
	return paint.measureText(string);
}

public float getTextHeight(String message) {
	Paint paint = new Paint();
	FontMetrics fontMetrics = paint.getFontMetrics();
	return fontMetrics.bottom-fontMetrics.top;
}

お・ぼ・え・が・き (´-人-`)


Suspicious method call

eclipseで"Suspicious method call"が出たら、@SuppressLint("WrongCall")を
つけたり"Clear All Lint Makers"(リント警告の消去)等をすれば良いが、そもそも
on~というメソッド名を使用しなければ良い(´・ω・`)?
wrongcall

Androidでいきなりエラーが出るようになりました。


LogCatへの出力

Log.e(String title,String message);

という形で指定するらしい。
errorの場合は"e"、infoの場合は"i"という風にレベルを変えるみたい。

Androidでデバッグログを出力する方法


アクティビティーの画面方向の固定

AndroidManifest.xml内の<activity>タグの属性に

android:screenOrientation="portrait"

という風に追加する。横固定ならlandscapeを指定する。
当初、sensorとunspecifiedの違いが今ひとつわからなかったが、
これはシステムの方で自動回転を有効にしていたからだった(ノ∀`)
システム設定に依存せずにアプリというかアクティビティーを
自動回転させたい場合はsensorにしろということか。

方向のみ固定で傾きによってその方向にのみ反転するのはどうするんだろうか?
プログラム的にやれるのかな?

画面の向き(ScreenOrientation)


s2.8 障害物を作る.2のDiagramCalcrクラスに
isHitメソッドが足らなくてエラーになる。→取り敢えず追加すればいい。

というよりもisHit、isHitLCがCollision、CollisionLCになってるくさい。


そのまま実行したらエラーになった。"_type"がnullの為、switchのところで
NullPoになっているみたい。

if (conf != null) {
			_rotaSpeed = conf.speed; // 回転スピード
			_type = conf.type; // 物体のタイプ
		}else{
			_type =Barricade.eType.OUT;
		}
		switch (_type) {

コメントで"// コンフィグを特に設定しない時はnullを渡すとデフォルト設定になる"と
あったが、BarricadeSquareはBarricadeをそのままnullを渡してしまうのでエラーになる。

protected eType _type = Barricade.eType.OUT;

if (conf != null) {
  _rotaSpeed = conf.speed; // 回転スピード
  _type = conf.type; // 物体のタイプ
}else{
  _type =Barricade.eType.OUT;
}

という風にしないといけないような気がする(´・ω・`)

appcompat_v7の除去(´・ω・`)?


追記20150115
久しくAndroidプロジェクトを新規作成していなかったので気付かなかったけど
最新版だと"appcompat_v7"プロジェクトが自動増殖しないみたいなので、
他にこれを利用するプロジェクトがある場合は"appcompat_v7"プロジェクトを
削除しては駄目(´・ω・`) fragment周りはなくなってる気がする…


appcompat_v7絡みを取り除く手順。
正しいのかどうかわからないのでこちらでのみ載っける(ノ∀`)
これはアクションバーを使用しないようなゲームサンプルを勉強する時に
余計なコードが入ってると「わけわかんねーよ、バーヤ、バーヤヽ(`Д´)ノ」と
怒りだしてしまうような俺氏みたいな初心者向けの手順。
或いはサポートライブラリを入れたくないけど非力なPCを使っているが故に
APIレベル14以上のエミュレータがまともに動かなかったりする人向け (ヽ'ω`) ワイノコトヤ

適当に画面スナップを撮ったので、もしかすると手順に無駄とか手違いがあるかも(ノ∀`)


※作成したプロジェクトが"test"、削除したいappcompat_v7フォルダが"appcompat_v7"の場合

  1. "appcompat_v7"フォルダを右クリックし、コンテキストメニューが表示されたら<削除>をクリック。
    delete-01
     
  2. チェックを入れて<OK>をクリック。delete-02
     
  3. "test"フォルダを右クリックし、コンテキストメニューが表示されたら、[プロパティ]をクリック。
    delete-03
     
  4. 「~のプロパティ」画面が表示されたら、左ペインで[Android]を選択し、「ライブラリ」セクションで削除するライブラリプロジェクトを選択し、<除去>をクリック。除去されたら<OK>をクリック。
    delete-04
     
  5. 各valuesフォルダ内のstyles.xml、menuフォルダ内のmain.xml、layoutフォルダ内のfragment_main.xmlファイルを削除。styles.xml、main.xmlはそれぞれファイル内のタグを削除すればエラーは消えるような気もするけれども面倒臭いのでファイルごと削除してる(・∀・) fragment_main.xmlも邪魔くさいから削除。
    delete-05
     
  6. MainActivity.javaをダブルクリック。
    delete-06
     
  7. import文、extends文の"ActionBar"部分、コードの一部を削除。
    delete-07
     
  8. "Activity"用のimport文を追加。
    delete-08
     
  9. onCreateOptionsMenuメソッド、onCreateOptionsMenuメソッド、PlaceholderFragmentクラスを削除。
    delete-09
    delete-10
     
  10. AndroidManifest.xmlファイルを開き、<Application>タグ内の"android:theme="@style/AppTheme""を削除。
    delete-11
     
  11. MainActivity.java内に"import android.R;"が存在していたら削除。
    delete-12
     
  12. "test"プロジェクトを右クリックし、コンテキストメニューからビルドパスの構成を開く。delete-13
     
  13. 「ライブラリ」タブを開き、"Android Private Libraries"を選択して<除去>をクリック。
    delete-14
     

という手順で空っぽに近くなるような気がする( ・`ω・´) チガッタラゴメンナサイ