私はJava/Androidを初めて使用します。ストロボライトのように、カメラからの電撃/フラッシュのオンとオフを切り替える必要があり、オンとオフの長さを制御する必要がある学校のプロジェクトのアプリケーションを開発していますThread.sleep();
。待ち時間ですが、それは十分に正確ではありません。ある種のタイマーを使いたいSystem.nanotime()
のですが、これを使う良い方法がわかりません。ハッカーの誰かが私を助けてくれますか?
私はこれを試しました。より良い方法があることを願っています。
public void waiton(int ms){
long t0 = System.nanoTime()+ ms*1000000;
while(t0 > System.nanoTime()){
}
}
睡眠の代わりに。
Threat.sleep(5);
安定したストロボライトをどれだけ速く作ることができるかを知りたいのですが、最終的にはストロボライトではありませんが、どれだけ速く作ることができるかを知りたいです。勉強用です!:P。
ここで私が取り組んでいるコードを見ることができます。
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Switch;
public class FlashActivity extends Activity {
public Camera cam = Camera.open();
int i = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.flashview);
final Button onbutton = (Button)findViewById(R.id.onbutton);
final Button offbutton = (Button)findViewById(R.id.offbutton);
final Switch switchonoff = (Switch)findViewById(R.id.switch1);
onbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
i = 1;
new Thread(new Runnable() {
public void run() {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
Camera.Parameters p = cam.getParameters(), p2 = cam.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
p2.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
cam.startPreview();
cam.cancelAutoFocus();
//cam.autoFocus(null);
while (i == 1){
cam.setParameters(p);
waiton(10);
cam.setParameters(p2);
waitoff(10);
}
}
}).start();
}
});
offbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
i = 0;
cam.stopPreview();
}
});
switchonoff.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Switch nv = (Switch)v;
if(nv.isChecked()){
i = 1;
}else{
i = 0;
}
}
});
}
@Override
protected void onStop() {
super.onStop();
cam.stopPreview();
i = 0;
if (cam != null) {
cam.release();
}
}
@Override
protected void onPause() {
super.onStop();
cam.stopPreview();
if (cam != null) {
cam.release();
}
}
public void waiton(int ms){
long t0 = System.nanoTime()+ ms*1000000;
while(t0 > System.nanoTime()){
}
}
public void waitoff(int ms){
long t1 = System.nanoTime()+ ms*1000000;
while(t1 > System.nanoTime()){
}
}
};
スイッチを無視してください。現在、2つのボタンからスイッチに変換しています。しかし、私は以前にフラッシュを機能させたいので、さらにいくつかの変更を加えます。
カメラを使用せずに電撃戦/フラッシュを制御する方法がある場合、それはすべての新しいAndroid携帯電話で機能します。それは完璧でしょう。
オートフォーカスに問題があり、しばらくの間エラーが発生します。これにより、プログラムが不安定になる可能性があります。フォーカス領域を0,0,0,0にすることができず、何をすべきかわからない場合があります。に変更します。
後でそれが機能するとき、私はそれをステートマシンに変換して、それからいくつかのより多くの機能を引き出すと思います。それが私にとって可能であるならば:p。