2013年8月29日木曜日

Google Play ポリシーの強化詳細

ポリシー画像
グーグルプレイのポリシーが強化されました。

このポリシーは既存のアプリ全てに適応されます。

特に強化される点は、

性表現を含むコンテンツ
知的財産権
個人情報の送信

が挙げられます。

性表現を含むコンテンツについては、文章的な表現や自動ポルノなど、違法性や象徴権、著作権など知的財産権も含んでいるコンテンツが多いため、一発アカント削除になるでしょう。

知的財産権については、2チャンネルのコピペや違法動画へのリンクも対象になるでしょう。
>知的財産権の侵害を助長、誘導したりしないでください。

個人情報の送信は、何かと問題になっています。下手をすると結構な数のアプリが公開停止になるでしょう。

絵画グーグル関係のアカウントは一つ停止されると回復できません。利用できなくなるわけではありませんが、何かを公開するなどが不可能になってしまいます。

アプリを公開している方々は、グーグルの動きを見つつ線引をしてください。




2013年8月18日日曜日

スマホゲーム開発の注意点

ゲーム開発コスト

スマホのゲーム開発の注意点はUIかもしれない。
スマホにソフトウエアコントローラを実装してみましたがいまいちです。
文字入力のフリック入力やスワイプ入力のような新しい入力方法が現れるかも。
とはいえ物理入力装置がないだけでゲームジャンルが限られてしまいます。
磁気センサーなど各センサーを利用して、任天堂のような開拓が必要かもしれません。

2013年8月17日土曜日

BMP拡大回転反転などの画像処理クラス

色々と使える画像処理クラスを公開。

呼び出しサンプル
BitmapManerger bm =new BitmapManerger(getApplicationContext());

Bitmap bmp =bm.yomitori("512.png", 50);

//Bitmap bmp2= bm.syukusyou(bmp, 1f, 0.5f);
Bitmap bmp2 =bm.kaiten(bmp, 90);

bmp= bm.iro(bmp,0xffff0000);


//bmp=bm.hanten(bmp2);

Bitmap bmp3 =bm.gousei(bm.hairetu(bmp, bmp2));


iv.setImageBitmap(bmp3);

import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;

public class BitmapManerger {

Context cn;

public BitmapManerger(Context c) {
cn = c;
}

// 配列ゼロ板をキャンパスサイズにする。添え字が大きいほど上位レイヤー
public Bitmap gousei(Bitmap[] bmp) {
// ARGB_8888,RGB_565 ARGB_4444 RGB_565
Bitmap rbmp = Bitmap.createBitmap(bmp[0].getWidth(),
bmp[0].getHeight(), Bitmap.Config.ARGB_4444);//アルファチャンネルが必要
Canvas canvas = new Canvas(rbmp);



for (int i = 0; i < bmp.length; i++) {
canvas.drawBitmap(bmp[i], 0, 0, (Paint) null);
}

return rbmp;
}

public Bitmap yomitori(String pass,int size) {

InputStream is = null;

Bitmap bmp = null;

BitmapFactory.Options imageOptions = new BitmapFactory.Options();
imageOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, imageOptions);

float imageScaleWidth = (float)imageOptions.outWidth / size;

BitmapFactory.Options imageOptions2 = new BitmapFactory.Options();
imageOptions2.inSampleSize=(int) imageScaleWidth;
//Bitmap.Config.ARGB_4444
imageOptions2.inPreferredConfig=Bitmap.Config.ARGB_4444;
try {

// assets フォルダ読み取り
is = cn.getResources().getAssets().open(pass);
//
bmp= BitmapFactory.decodeStream(is, null, imageOptions2);

//bmp[i] = BitmapFactory.decodeStream(is);


} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

return bmp;
}
// 画像のパス配列をビットマップ配列に
public Bitmap[] yomitori(String[] pass,int size) {

InputStream is = null;

Bitmap[] bmp = new Bitmap[pass.length];

BitmapFactory.Options imageOptions = new BitmapFactory.Options();
imageOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, imageOptions);

float imageScaleWidth = (float)imageOptions.outWidth / size;

BitmapFactory.Options imageOptions2 = new BitmapFactory.Options();
imageOptions2.inSampleSize=(int) imageScaleWidth;
imageOptions2.inPreferredConfig=Bitmap.Config.ARGB_4444;

try {

for (int i = 0; i < pass.length; i++) {
// assets フォルダ読み取り
is = cn.getResources().getAssets().open(pass[i]);
//
bmp[i] = BitmapFactory.decodeStream(is, null, imageOptions2);

//bmp[i] = BitmapFactory.decodeStream(is);
}

} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

return bmp;
}

/ 縦横比率を変えずに高さ縮小
public Bitmap syukusyou(Bitmap bmp, float ww, float hh) {

Bitmap rbmp;

Bitmap cbmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(),
Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(cbmp);

Matrix matrix = new Matrix();

matrix.postScale(ww, hh);

// リサイズ画像
rbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),
matrix, true);

int poji = cbmp.getHeight() - rbmp.getHeight();
canvas.drawBitmap(rbmp, 0, poji, (Paint) null);

return cbmp;
}
//ok 
public Bitmap hanten(Bitmap bmp) {

Matrix matrix = new Matrix();

// 上下反転
// matrix.preScale(1, -1);
// 左右反転
matrix.preScale(-1, 1);
Bitmap rbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
bmp.getHeight(), matrix, false);

return rbmp;
}

// 画像を回転 (画像、回転) 時計回り 90で右回転
public Bitmap kaiten(Bitmap bmp, int inint) {

Matrix mat = new Matrix();
mat.postRotate(inint);

Bitmap rbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
bmp.getHeight(), mat, true);
return rbmp;
}

// 色を変更する
public Bitmap iro(Bitmap bmpImage, int inint) {

if (bmpImage == null) {
return null;
}

int w = bmpImage.getWidth();
int h = bmpImage.getHeight();
int initpixels[] = new int[(bmpImage.getWidth() * bmpImage.getHeight())];
bmpImage.getPixels(initpixels, 0, bmpImage.getWidth(), 0, 0,
bmpImage.getWidth(), bmpImage.getHeight());

// bmpImage.recycle();

for (int xx = 0; xx < (w * h) - 1; xx++) {

// 0xFFFFFF00
initpixels[xx] = (initpixels[xx] & inint);

}

Bitmap rBmp = Bitmap.createBitmap(initpixels, w, h,
Bitmap.Config.ARGB_4444);// (initpixels, 0, width, 0, 0, width,
// height);

initpixels = null;

return rBmp;

}

// 任意のタイミングでメモリ解放を
public void kaihou(Bitmap[] bmp) {
for (int i = 0; i < bmp.length; i++) {
bmp[0].recycle();
}
}
複数のBMPを配列へ
public Bitmap[] hairetu(Bitmap bmp1,Bitmap bmp2){
Bitmap[] bmp = new Bitmap[2];
bmp[0]=bmp1;
bmp[1]=bmp2;
return bmp;
}
public Bitmap[] hairetu(Bitmap bmp1,Bitmap bmp2,Bitmap bmp3){
Bitmap[] bmp = new Bitmap[3];
bmp[0]=bmp1;
bmp[1]=bmp2;
bmp[2]=bmp3;
return bmp;
}
public Bitmap[] hairetu(Bitmap bmp1,Bitmap bmp2,Bitmap bmp3,Bitmap bmp4){
Bitmap[] bmp = new Bitmap[4];
bmp[0]=bmp1;
bmp[1]=bmp2;
bmp[2]=bmp3;
bmp[3]=bmp4;
return bmp;
}
public Bitmap[] hairetu(Bitmap bmp1,Bitmap bmp2,Bitmap bmp3,Bitmap bmp4,Bitmap bmp5){
Bitmap[] bmp = new Bitmap[5];
bmp[0]=bmp1;
bmp[1]=bmp2;
bmp[2]=bmp3;
bmp[3]=bmp4;
bmp[4]=bmp5;
return bmp;
}

}

2013年8月15日木曜日

エクセル16進数10進数2進数を変換する関数

n進数のデータを作成する際のメモ


BIN2DEC(String) 2 進数を 10 進数に変換 
BIN2HEX(String) 2 進数を 16 進数に変換 
BIN2OCT(String) 2 進数を 8 進数に変換 
DEC2BIN(String) 10 進数を 2 進数に変換 
DEC2HEX(String) 10 進数を 16 進数に変換 
DEC2OCT(String) 10 進数を 8 進数に変換 
HEX2BIN(String) 16 進数を 2 進数に変換 
HEX2DEC(String) 16 進数を 10 進数に変換 
HEX2OCT(String) 16 進数を 8 進数に変換 
OCT2BIN(String) 8 進数を 2 進数に変換 
OCT2DEC(String) 8 進数を 10 進数に変換 
OCT2HEX(String) 8 進数を 16 進数に変換 

エクセルの関数は便利です。

2013年8月13日火曜日

HTMLとJAVAScriptの難読化

でこんぱいるIPA
HTMLで作成したアプリはOSに依存しないためiOSとANDROIDの同時開発が可能になります。
WebプログラマーならJAVAScriptとCSSに慣れていて有利かもしれません。
Web Workersスレッドでマルチスレッドも可能になってきていますし。

問題はリソースを難読化しないとアプリを改ざんして再配布されてしまうことです。
現にいくつのアプリか不正な配布が行われていますが、グーグルプレイやアップルストアは開発者の権利を守ってはくれません。

JAVAは特にデコンパイルしやすいのでHTMLメインでアプリを作成すると、
簡単に復元、改ざんされてしまいます。

タイタニウムは難読化機能を備えていません。事前にHTMLを暗号化して、ネイティヴに複合する必要があります。

プログラマーに向いているタイプ


プログラマーIQ


情報系の学生から、自分がプログラマーに向いているか知りたいと聞かれることがあります。
私は「自力でソートを書いてみて」と返すのですが、フローチャートを書くのも慣れないと難しいのかもしれません。今の時代ソート処理なんか誰かがやってくれます。私自身クイックソートはコピペしますし。。

一般的にSEやプログラマーは頭がよさそうなイメージなようです。
テレビドラマのスーパーハカーのイメージなのでしょうか。

職種別IQを見てみると

医者や弁護士は最低でも東大生レベルのIQ130以上が必要。
ちなみに日本人の平均IQは115です。

プログラマーは最低でもIQ100以上。
日本人の6割はプログラマーになれるIQです。
一般からみるとプログラマーのIQは高さそうですが、
世界の平均IQが100ですから、大したことはありません。

まず言えることはプログラマーにIQの高さは必要ない


プログラマに必要なのはCISCよりRISC的なCPU。
それと高速で大きなVRAMです。

例えると、パソコンよりもゲーム機。

具体的には、目的から過程を想像し、論理だてる能力。
感覚的に大量の事象を組み合わせることです。
ようはパズルです。ピタゴラスイッチです。
説明書なしに道具を扱ったり、組み立てることが得意な人が、
プログラマーに向いています。

経験から統計を出すと、
IT系企業に入ってくる5人に1人はプログラマーに向いています。
向いている一人は、瞬時に論理だててプログラムを書いていけるタイプ。
他の2人は普通。時間はかかるがプログラミング可能程度のタイプ。
残りの2人は全く使えない。「なぜこうなる?」で固まってしまう。思考が停止するタイプ。
重要なのは目的から過程をイメージすること、始まりと結果だけを捉えること。
1+1=2であること以外は考えない。1が何故1であるかを考えても意味がないことです。
複数の結果から類推し、必要な結果を部品として得る。それを組み合わせることで目的を完成させる。それがプログラムです。

誇張して表現しているところもありますが、
向いている人とそうでない人で生産性が数倍違うのがIT業界です。

2013年8月12日月曜日

ソフトウエアゲームコントローラーのサンプル

アクションゲームでは見えないコントローラーを作ってみましたが、RPGなどではボタンの表示が必要です。

ゲーム開発コントロールサンプル画像

今回はレイアウトファイルでコントローラーを作成してみました。

この場合はクリックイベントではなく、タッチイベントを使用します。

サーフェースビューでコントローラーを作成しても良いのですが、
一部GUIにスクロール機能を付けたかったため手抜きをしました。
できるだけコードは書きたくないので。。


ボタンを大きくすると、どうしてもゲーム画面が小さくなってしまいます。
しかし、綺麗なグラフィックを売りにするつもりはありませんので、
操作性を重視してコントローラーを大きめにしています。


サンプルソースはこちら

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

    <LinearLayout
        android:id="@+id/lay1"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="vertical" >

        <com.example.gametest2.GameView
            android:id="@+id/gameView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/lay_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="20"
        android:orientation="vertical" >

        <MultiAutoCompleteTextView
            android:id="@+id/multiAutoCompleteTextView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:text="MultiAutoCompleteTextView" >

            <requestFocus />
        </MultiAutoCompleteTextView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/lay2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >

        <ScrollView
            android:id="@+id/scr1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/sute"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Status" />

            <Button
                android:id="@+id/aitemu"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:layout_marginRight="8dp"
                android:layout_weight="1"
                android:text="Tool" />

            <Button
                android:id="@+id/sukiru"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="8dp"
                android:layout_weight="1"
                android:text="Skill" />

            <Button
                android:id="@+id/sisutemu"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="System" />

        </LinearLayout>
        </ScrollView>

        <LinearLayout
            android:id="@+id/lay_jyuji"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" >

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="0.50"
                android:orientation="vertical" >

                <Button
                    android:id="@+id/jyuuji7"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="○" />

                <Button
                    android:id="@+id/jyuuji4"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="←" />

                <Button
                    android:id="@+id/jyuuji1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="○" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="0.50"
                android:orientation="vertical" >

                <Button
                    android:id="@+id/jyuuji8"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="↑" />

                <Button
                    android:id="@+id/jyuuji5"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="□" />

                <Button
                    android:id="@+id/jyuuji2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="↓" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="0.50"
                android:orientation="vertical" >

                <Button
                    android:id="@+id/jyuuji9"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="○" />

                <Button
                    android:id="@+id/jyuuji6"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="→" />

                <Button
                    android:id="@+id/jyuuji3"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="○" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/lay_atk"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="15dp"
                android:orientation="vertical" >

                <Button
                    android:id="@+id/houkou"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="⇔" />

                <Button
                    android:id="@+id/kougeki"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="ATK" />
                
                <!--Android 縦方向に均等に  -->
            </LinearLayout>
        </LinearLayout>



    </LinearLayout>

</LinearLayout>



カスタムダイアログ サンプル

カスタムダイアログのさんぷる

カスタムダイアログ


カスタムダイアログ用のクラス作成して部品化してみました。

呼び出し
Daiarogu dl = new Daiarogu();
dl.create(this);

Daiarogu クラス 
    public void Create(Activity act) {
   
        // カスタムビュー
        LayoutInflater inflater = (LayoutInflater)act.getSystemService(
        act.LAYOUT_INFLATER_SERVICE);
        final View layout = inflater.inflate(R.layout.daiarogu,
        (ViewGroup)act.findViewById(R.id.daiarogu_lay));

        // ダイアログ
        AlertDialog.Builder builder = new AlertDialog.Builder(act);
        
        show(builder,layout);
    }
    
    private void show(Builder builder,View layout){
   
        builder.setTitle("タイトル");
        builder.setView(layout);
        
        ImageView iv
        = (ImageView)layout.findViewById(R.id.daiarogu_gazo);//仮の
        
        TextView pass
        = (TextView)layout.findViewById(R.id.daiarogu_text);
        
        pass.setText("てすと1");
        
        builder.setPositiveButton("Positive", new OnClickListener () {
            public void onClick(DialogInterface dialog, int which) {
                // android4以降なら右

            }
        });
        builder.setNegativeButton("Negative", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // android4移行なら左
            }
        });
        builder.setNeutralButton("Neutral", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // android4移行なら中央
            }
        });

        // 表示
        builder.create().show();
    }

DAIARGO.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/daiarogu_lay"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/daiarogu_gazo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/daiarogu_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.50"
        android:gravity="center_vertical"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />


</LinearLayout>


2013年8月11日日曜日

GooglePlay新規参入は困難

グーグルプレイは人気の高いアプリを検索結果上位に表示します。

検索キーワードと関係のないアプリで検索結果が溢れることも珍しくない。

ダウンロード数の少ないアプリはキーワードに関連しようが表示されません

つまり、

ダウンロード数が多いアプリ = ダウンロードされやすくなる

新規参入 ダウンロードが少ないアプリ = ダウンロードがされにくくなる

ダウンロードが少ないアプリはダウンロードされにくため。
永遠にダウンロードが少ないままとなる。

どんなに良いアプリでもダウンロードされなければ誰にも見えない


企業なら広告で補うこともできるが初期費用が嵩むこと間違いない。

せめてアマゾンのようにアプリに検索キーワードを指定できれば、
関係のないアプリが検索結果に表示されなくなるのに。


ディスプレイサイズを取得する

API Levele13からディスプレイサイズの取得方法が変わりました。
昔のコードも使えますが念のため覚書

アクションバーやステータスバーのサイズも考慮しなくてはいけない。

   WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
   Display disp = wm.getDefaultDisplay();
   
   int haba=0,taka=0;
   
   try{//API Levele12以下
   
   taka = disp.getHeight();
      haba =  disp.getWidth();
   }catch(Exception e){
    e.printStackTrace();
   }
   
   if(haba<=0){//API Levele13以上
   Point size = new Point();
   disp.getSize(size);
   
   haba = size.x;
   taka =size.y;
   }

iOS7の新機能

iOS7のβ版が今月リリースされました。

今回のバージョンアップでiOSはANDROIDにだいぶ近くなってきました。

・主な新機能

ウジェット
ステータスバー
マルチタスク
その他(大した機能ではない)

注目する機能はANDROIDのパクリばかりです。

AppleとGoogleは互いに機能をパクリあって進化しています。
特許の面でAppleに部があるようです。Googleは最近作られたばかりの企業ですからね。
Androidはカクつくとよく言われますが、あれはアニメーションの特許の差です。
内部処理速度自体はC言語とJAVAの差程度です。(Androidは性能面で補っている)

iOS7のアップデートでiPhoneのホームにテザリングボタンを付けられるようになるかも。

アップデートの予定はいつだろう。

2013年8月10日土曜日

Bitmapの合成 サンプル

複数のBitmapを一つのBitmapに合成するサンプル。

INT配列に書き込むなど、キャンパスを使わない方法もあるが処理速度はあまり変わらない。
getPixcelとsetPixcelで合成するのは処理が遅すぎて使い物にならない。※高性能な端末でも不可能だと思っていい。



// 配列ゼロ板をキャンパスサイズにする。添え字が大きいほど上位レイヤー
public Bitmap gousei(Bitmap[] bmp) {
// ARGB_8888,RGB_565 ARGB_4444 RGB_565
Bitmap rbmp = Bitmap.createBitmap(bmp[0].getWidth(),
bmp[0].getHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(rbmp);

for (int i = 0; i < bmp.length; i++) {
canvas.drawBitmap(bmp[i], 0, 0, (Paint) null);
}

return rbmp;
}

//任意のタイミングでメモリ解放を
public void kaihou(Bitmap[] bmp){
for (int i = 0; i < bmp.length; i++) {
bmp[0].recycle();
}
}

Drawable とBitmapの互換変換

画像クラスの変換例


Resource to Bitmap

BitmapFactory.decodeResource(getResources(), R.drawable.icon)


Drawable to Bitmap

((BitmapDrawable) drawable).getBitmap()


Resource to Drawable

getResources().getDrawable(R.drawable.icon)


Bitmap to Drawable

new BitmapDrawable(bitmap)

他にもINT配列をBitmapにできる。

XMLカスタムダイアログ風ポップアップビュー

カスタムダイアログ風のサンプル

正確にはオーバーレイを使用したダイアログ風のポップアップ。

ダイアログを使用するよりも、ビューを使用したほうが柔軟性が高い。

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

private View view = null;
private WindowManager mWindowManager = null;

private Button btn;
private CheckBox chk;

private boolean LFL = false;

public void showView(Context cn,WindowManager wm) {

mWindowManager=wm;

if (LFL == false) {

LFL = true;
//インフレータ
LayoutInflater inflater = LayoutInflater
.from(cn);

// レイアウトXMLインフレート
view = inflater.inflate(R.layout.main_list, null);

btn = (Button) view.findViewById(R.id.list_toji);
chk = (CheckBox) view.findViewById(R.id.list_soku);

view.findViewById(R.id.list_toji).setOnClickListener(this);
view.findViewById(R.id.list_soku).setOnClickListener(this);


LayoutParams params = new LayoutParams();

// 全画面
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.type = LayoutParams.TYPE_PHONE;

if (mWindowManager == null) {
mWindowManager = (WindowManager) cn
.getSystemService(Context.WINDOW_SERVICE);
}
mWindowManager.addView(view, params);

} else {
mWindowManager.removeView(view);
}
}
public void toji(){
if(LFL){
LFL = false;
mWindowManager.removeView(view);
}
}

2013年8月9日金曜日

ホームボタンとバックボタンのイベント

ホームキーイベントはonUserLeaveHintで画面遷移を検知する方法があります。
電話着信時はonUserLeaveHintは発生しません。

戻るボタンはdispatchKeyEventまたはその他キーイベントで検知できます。

ホームボタンを無効にはできません。
しかし、システムオーバーレイやonUserLeaveHintからの再表示などで画面を遷移させないように見せることは可能です。


@Override
public void onUserLeaveHint() {
// ホームボタンが押された時

}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// バックボタンが押されたとき
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

return true;// 無効
}
}
return super.dispatchKeyEvent(event);
}

おすすめの漫画ビューアアプリ

タブレットPCの販売台数がノートPCの販売数を超えました。

タブレットPCはARMアーキテクチャなので電気消費が少なく、充電を気にせず持ち歩けます。
作業面ではUSBホスト機能があればキーボードを挿して使うこともできます。

タブレットPC(USBホスト機能付き)+キーボード = ノートPC

タブレットは本を読むことに適しています。

漫画ビューアは「漫画ビューア ブルーライトカット」をお勧めします

このアプリは一切の権限を必要としない。シンプルなアプリです。
現在出回っている液晶はLEDをバックライトにしてします。
青色発光ダイオードは紫外線に近いエネルギーをもっており、
網膜にダメージを与えることが懸念されています。
これは青色以上の光を変換して白色光に変換しているからです。
蛍光灯が紫外線を可視光にする原理と同じです。
視力低下を防止するためにもブルーライトカット漫画ビューアをお勧めします。

見開きには対応していません、ディスプレイサイズや解像度的に縦使用を想定しているからです。
しおりを挟むことはもちろん。
二点タッチで拡大や表示位置の調整ができます。
ダブルタップでクイック拡大できます。

2013年8月7日水曜日

ハンゲームのログイン画像認証に失敗しました。

久々にハンゲームにログインしようとすると、
「画像認証に失敗しました。 正しい文字列を入力し、もう一度お試しください。 」
と表示されることがあります。

困ったことに、このエラーメッセージが表示されると、
ID、パスワード、画像認証、が正しくてもログインできないことがあります。

一応、クッキーやキャッシュを削除することで解決します


何物かが私のアカウントに不正ログインしようとしたのだと思います。

ハンゲームのログインIDは名前でもあるので外部に公開されています。
そのためIDからパスワードを推測して攻撃をしてきます。
IDとパスワードに何らかの関係がある単語を使うと危険です。

クッキーやキャッシュを削除したくないときは非常に不便です。
しかたなく、IEを使用してログインしました。
久々にIEを立ち上げましたが、重い。。ハンゲームのページが全然開かれない。。

ちなみにブラウザはパソコンではクローム。
スマホでファイヤーフォックスです。
広告を消せて、高速ならなんでもいいですけどね。

2013年8月5日月曜日

シリアライズ保存 サンプルソース


シリアライズしたデータの保存読み取りサンプル
型引数を使えばより柔軟な保存処理になります。、

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.content.Context;
import android.util.Log;

//配列はすでにSerializableをインプリメントしています。
public class SaveLoad {
private String TAG = "aa";
private Context cn;

SaveLoad(Context context) {
cn = context;
}

public void set(String fileName,int[] data) {
try {
FileOutputStream fos = cn.openFileOutput(fileName,
cn.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
} catch (Exception e) {
Log.d(TAG, "setError");
}
}

public int[] get(String fileName) {
try {
FileInputStream fis = cn.openFileInput(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
int[] data = (int[]) ois.readObject();
ois.close();
return data;
} catch (Exception e) {
Log.d(TAG, "getError");
}
return null;
}

}