ノンプログラマー・プログラミング・ガイド

ほぼ独学。もはやおっさんになりかかってからプログラミングの勉強開始。HTML、CSS、JavaScript、SQL、PHP、Javaがなんとなく解る。Joomla!とandroidで書いたプログラムを配布中。iPhoneアプリ作りたいからMacくれ(下さい)。

Androidのアプリは、シングルスレッドとかいう処理の仕組みを採用していて、別のスレッドを作成した場合に、その別スレッドからアプリ内のViewを操作することはできなくなってます。僕の乏しい理解力だと、そもそもスレッドとはなんぞや?というレベルなんですが、まぁ、別のスレッドからはUI操作はできないと言うことらしいです。もし別のスレッドからUIを操作したら、こんなエラーが表示される模様

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


解決策:外部スレッドからUI操作をするためのメソッド

        runOnUiThread(new Runnable() {

            public void run() {
                 //UI操作するコードをここに書く
            }
        });     

ActivityのメソッドにrunOnUiThreadなるメソッドが用意されています。runの中では、UI操作ができる模様。


 

AndroidのアプリでActivityを呼び出すときのアニメーション(画面変移)を設定する方法です。何も設定しない場合は、Intent使ってActivityを呼び出したときは、ブワッっと前にでてくるアニメーションなんですけど、横にスライドしたり、透過させたりのアニメーションに変える事も可能です。このメソッドは、Activity自体に適用させるメソッドです。画面内のViewなんかに適用させるアニメーションではありません。


使うメソッドは、これ。
overridePendingTransition ( R.anim.in_anim, R.anim.out_anim);
ActivityでIntentを呼び出した後に、上記のコードを呼び出します。


NextActivityを呼び出してアニメーションを適用したい場合は、インテントを呼び出した後で、こんな感じにoverridePendingTransitionを使います。
Intent i = new Intent(this, NextActivity.class);
startActivity(i);
overridePendingTransition ( R.anim.in_anim, R.anim.out_anim);
この場合、NextActivityはin_animで設定したアニメーションが適用され、Intentを呼び出したクラスには、out_animが適用されます。


animの設定

アニメーションはxmlファイルで指定します。overridePendingTransitionで渡した引数がアニメーションが書かれたxmlのファイルです。で、xmlは、resの配下にanimフォルダー内に設置します。animフォルダーがresフォルダーの配下にない場合は、animとフォルダー名を指定して、フォルダーを新規作成してください。


下記のサンプルのアニメーションは、新しいActivityを右らから左にスライドさせて、古いActivityを元の位置から左側に追い出してます。

in_anim.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">     
  <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="200"/>
</set>  
横(X)方向の位置を右側(-100%p)において、Xの位置を元の場所(0)に戻すアニメーションを設定しています。


out_anim.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">  
  <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="200"/>
</set>  
左側に抜けていかせたいので、元の位置から画面一個分(100%p)左側に移動させてます。


*呼び出したActivityから元のActivityに戻るときにもアニメーションを設定したい場合は、呼び出したActivity側でもoverridePendingTransitionを設定してやる必要があります。


使えるアニメーションのタグ

translateは、移動させるアニメーションを定義しているんですが、察するに、多分この辺(Animation Resources : View)のアニメーションのタグが使えるんじゃないのかと思います。

  • alpha : 透過
  • translate : 移動
  • rotate : 回転
  • scale : 拡大・縮小


複数のアニメーションを適用することも可能

たとえば、translateとalphaとrotateを組み合わせたりってこともできます。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">  
	 <scale 
	     android:fromXScale="1.2" 
	     android:fromYScale="1.2"
	     android:toXScale="1.0" 
	     android:toYScale="1.0"
	     android:pivotY="0.0" 
	     android:pivotX="0.5" 
	     android:duration="300" />      
    
	 <translate 
	     android:fromXDelta="100%p" 
	     android:toXDelta="0" 
	     android:duration="250"/>

	<rotate
	  android:fromDegrees="15"
	  android:toDegrees="0"
	  android:pivotX="0%"
	  android:pivotY="100%"
	  android:duration="300"
	  android:startOffset="0" />  

</set>  


 




 

この記事では、OpenCVを使った結果だけをしりてーんだよ。C++とかいらねーんだ。javaだけでいいんだ。って人向けの記事です。OpenCV自体の開発をどうこうしようって人向けではありません。僕は、そんなところを理解すらしてません。


OpenCVは、画像を解析してくるオープンソースのライブラリーです。画像の中から顔を検出してくれたり、口や目を検出してくれたり、素敵ライブラリーみたいです。もともとは、Cで書かれた言語らしいんですけど、他の言語にも対応してくれてるみたいっす。


1. OpenCVのAndroid向けのファイルを入手

OpenCVのAndroid SDKを入手して、インストールしてみてくだせい。この記事を書いている時点での最新版は、2.4.6です。サンプルにもそれを使ってます。


2. 解凍してEclipseでインポート

zipファイルなんで解凍してEclipseにインポートします。「ファイル→インポート→Existing Android Code Into WorkSpace(既存のAndroidコードをワークスペースへ)」を選択します。解凍したフォルダーは、さらにフォルダー別けされているんですが、Eclipseでインポートするときに解凍したフォルダーのルートあたりを参照すれば、.EclipseさんがAndroidのファイルを探してくれて、サンプルとライブラリー全てを見つけ出してくれます。サンプルは、好きな奴だけインポートすればいいんですけど、opencv/sdk/javaにあるライブラリーだけは、必ずインポートするようにしてください。


3. 環境構築完了

終わりです!他のブログなんかには、C++を変換するAndroid NDKがどうとか書かれているんですけど、OpenCVの結果だけを知りたい場合やC++で開発しねーしってな場合は、Android NDKの設定とか必要ありません。



4. サンプルにエラーが表示される

以下の理由が考えられます。

  • ライブラリーが正しく参照されていない。
  • Android NDKの設定が必要

OpenCVのライブラリーが正しく参照されていない
それぞれのサンプルは、OpenCV Library 2.x.xなるライブラリーを参照する必要があります。ライブラリーが正しく参照されているか確認するには、パッケージエクスプローラで対象のサンプルアプリの上で右クリックして、プロパティ→Android→ライブラリーの部分を確認しください。エラーの場合は、バツ印が表示されているはず。追加でOpenCV Libraryを選択すればオッケーなはず。


Android NDKの設定が必要
 srcやresのならびに、jniのフォルダーがあるサンプルアプリの場合は、Android NDKの設定が必要です。C++の変換を行うんですが、C++なんてしらねーし。って事で諦めましょう。




5. Javaだけで顔の認識をさせてみる

サンプルの中に、顔認識のアプリであるOpenCV Sample face-detectionなるアプリがあるのですが、なんでか、C++のコードとまぜまぜに書かれています。なので、Android NDKの設定が必要で、上の手順どおりだとエラーが表示されるはず。これをJavaの部分だけをピックアップしてみたのがこのコード。NDK無しで動くはずです。

 https://www.dropbox.com/s/2pf7l3t00ibb3ly/OpencvDetectionJavaOnly.zip

コードの中にも書いてるんですけど、読み込むxmlファイルを変えれば、検出する部位も変えれるっぽいです。







 

 

このページのトップヘ