独自のカメラ アクティビティを実装しています。撮影した画像を回転させるには、撮影時の向きを知る必要があります。
デバイスの向きを教えてくれるセンサー値のピッチとロール用の高レベル API はあります
か
?
左右 - 携帯電話の上部が左側にある横向き
または、システムから直接取得する他の方法はありますか?
独自のカメラ アクティビティを実装しています。撮影した画像を回転させるには、撮影時の向きを知る必要があります。
デバイスの向きを教えてくれるセンサー値のピッチとロール用の高レベル API はあります
か
?
左右 - 携帯電話の上部が左側にある横向き
または、システムから直接取得する他の方法はありますか?
悲しいことに、カメラは、ランドスケープ モード (Android のカメラの「自然な」向き) ではない場合、Android で奇妙な方法で動作します。
最善の方法は、現在の方向を取得するために、アクティビティを横向きモードに設定し、onConfigurationChanged イベントを追加して (マニフェストに android:configChanges="orientation" を追加して) することです。
画像をキャプチャするときは、向きを確認し、必要なロジックに従って動作します。
OK は私の問題を特定の点まで解決したので、私にとってはうまくいき、ダウントップの認識を省略しました。
public class DeviceOrientation {
public static final int ORIENTATION_PORTRAIT = 0;
public static final int ORIENTATION_LANDSCAPE_REVERSE = 1;
public static final int ORIENTATION_LANDSCAPE = 2;
public static final int ORIENTATION_PORTRAIT_REVERSE = 3;
int smoothness = 1;
public float averagePitch = 0;
public float averageRoll = 0;
public int orientation = ORIENTATION_PORTRAIT;
private float[] pitches;
private float[] rolls;
public DeviceOrientation(int smoothness) {
this.smoothness = smoothness;
pitches = new float[smoothness];
rolls = new float[smoothness];
}
public void addSensorEvent(SensorEvent event) {
azimuth = event.values[0];
averagePitch = addValue(event.values[1], pitches);
averageRoll = addValue(event.values[2], rolls);
orientation = calculateOrientation();
}
private float addValue(float value, float[] values) {
float average = 0;
for(int i=1; i<smoothness; i++) {
values[i-1] = values[i];
average += values[i];
}
values[smoothness-1] = value;
average = (average + value)/smoothness;
return average;
}
/** handles all 4 possible positions perfectly */
private int calculateOrientation() {
// finding local orientation dip
if (((orientation == ORIENTATION_PORTRAIT || orientation == ORIENTATION_PORTRAIT_REVERSE)
&& (averageRoll > -30 && averageRoll < 30))) {
if (averagePitch > 0)
return ORIENTATION_PORTRAIT_REVERSE;
else
return ORIENTATION_PORTRAIT;
} else {
// divides between all orientations
if (Math.abs(averagePitch) >= 30) {
if (averagePitch > 0)
return ORIENTATION_PORTRAIT_REVERSE;
else
return ORIENTATION_PORTRAIT;
} else {
if (averageRoll > 0) {
return ORIENTATION_LANDSCAPE_REVERSE;
} else {
return ORIENTATION_LANDSCAPE;
}
}
}
}
説明: ポートレート モードでモービルを前方に傾けて水平位置にすると、コードの残りの部分によりランドスケープに切り替わります。そのため、ポートレートかどうかをチェックして、このモードを葉っぱにしにくい条件にしています。これは私が地元のディップでメンターするものです。残りは 3 方向すべてに分割されます。
一つ悪いことがあります。デバイスがlandscape_xにあり、後ろに少し傾けると、ピッチは〜2から〜175にジャンプします。その時点で、私のコードは横向きと縦向きの間で反転しています。
平滑度は、最後の n 個の値を組み合わせて平均を計算することにより、センサー データの値を平滑化します。それは本当に必要ではありません。
これが他の人に役立つことを願っています。コードをさらに改善できる場合は、お知らせください。