PS4 コントローラーをモデルとして Android アプリに取り込もうとしています。Androids Developer Page の例 (ジョイスティックとデジタル ボタン) は、私にとっては問題なく機能します。Log.e出力でこれを確認しました。R2 と L2 の値を取得する方法がわかりません。開発者ページでは、次のように説明されています。
ショルダー トリガー プレスを処理します (ただし、代替の入力方法を提供します)。一部のコントローラーには、左右の肩トリガーがあります。これらのトリガーが存在する場合、Android は左トリガーの押下を AXIS_LTRIGGER イベントとして報告し、右トリガーの押下を AXIS_RTRIGGER イベントとして報告します。Android 4.3 (API レベル 18) では、AXIS_LTRIGGER を生成するコントローラーも、AXIS_BRAKE 軸に対して同じ値を報告します。AXIS_RTRIGGER と AXIS_GAS についても同様です。Android は、0.0 (リリース) から 1.0 (完全に押された) までの正規化された値で、すべてのアナログ トリガー プレスを報告します。すべてのコントローラーにトリガーがあるわけではないため、プレーヤーが他のボタンでこれらのゲーム アクションを実行できるようにすることを検討してください。
次の行を追加します。
float rTrigger = historyPos < 0 ? event.getAxisValue(MotionEvent.AXIS_RTRIGGER) : event.getHistoricalAxisValue(MotionEvent.AXIS_RTRIGGER, historyPos);
processJoystickInput() へ: float rtrigger は常に 0.0 です
出来上がりが本当に楽しみです。
ありがとう
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean handled = false;
if ((event.getSource() & InputDevice.SOURCE_GAMEPAD)
== InputDevice.SOURCE_GAMEPAD) {
if (event.getRepeatCount() == 0) {
if (keyCode == 96)
Log.e("Taste:", "Square pressed");
if (keyCode == 97)
Log.e("Taste:", "Cross pressed");
if (keyCode == 98)
Log.e("Taste:", "Circle pressed");
}
if (handled) {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean handled = false;
if ((event.getSource() & InputDevice.SOURCE_GAMEPAD)
== InputDevice.SOURCE_GAMEPAD) {
if (event.getRepeatCount() == 0) {
if (keyCode == 96)
Log.e("Taste:", "Square released");
if (keyCode == 97)
Log.e("Taste:", "X released");
if (keyCode == 98)
Log.e("Taste:", "Circle released");
}
if (handled) {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
// Check that the event came from a game controller
if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) ==
InputDevice.SOURCE_JOYSTICK &&
event.getAction() == MotionEvent.ACTION_MOVE) {
// Process all historical movement samples in the batch
final int historySize = event.getHistorySize();
// Process the movements starting from the
// earliest historical position in the batch
for (int i = 0; i < historySize; i++) {
// Process the event at historical position i
processJoystickInput(event, i);
}
// Process the current movement sample in the batch (position -1)
processJoystickInput(event, -1);
return true;
}
return super.onGenericMotionEvent(event);
}
private void processJoystickInput(MotionEvent event,
int historyPos) {
InputDevice mInputDevice = event.getDevice();
// Calculate the horizontal distance to move by
// using the input value from one of these physical controls:
// the left control stick, hat axis, or the right control stick.
float lx = getCenteredAxis(event, mInputDevice,
MotionEvent.AXIS_X, historyPos);
float rx = getCenteredAxis(event, mInputDevice,
MotionEvent.AXIS_Z, historyPos);
float ly = getCenteredAxis(event, mInputDevice,
MotionEvent.AXIS_Y, historyPos);
float ry = getCenteredAxis(event, mInputDevice,
MotionEvent.AXIS_RZ, historyPos);
Log.e("LX:", lx + "");
Log.e("LY:", ly + "");
Log.e("RX:", rx + "");
Log.e("RY:", ry + "");
}
private static float getCenteredAxis(MotionEvent event,
InputDevice device, int axis, int historyPos) {
final InputDevice.MotionRange range =
device.getMotionRange(axis, event.getSource());
// A joystick at rest does not always report an absolute position of
// (0,0). Use the getFlat() method to determine the range of values
// bounding the joystick axis center.
if (range != null) {
final float flat = range.getFlat();
final float value =
historyPos < 0 ? event.getAxisValue(axis) :
event.getHistoricalAxisValue(axis, historyPos);
// Ignore axis values that are within the 'flat' region of the
// joystick axis center.
if (Math.abs(value) > flat) {
return value;
}
}
return 0;
}
}