Android-Joystickmiew仮想ハンドル、ホイール、カスタムUI
8672 ワード
一部の携帯電話ゲームでは、プレイヤーは仮想制御盤を通じてゲームキャラクターの行動を制御することができる.無人機や玩具操作アプリにもこのような制御盤の応用がある.
ハンドルのようなコントロールをカスタマイズするには、Viewをカスタマイズします.
関連コードはgithubを参照してください.com/RustFisher/…
Joystickmiew特性
現在Joystickmiewの特性は以下の通りである.2スタイル 固定制御盤; フローティング追従モード;ハンドルは指が最初にクリックした場所 に移動します.
は、背景に「矢印」、すなわち効果ピクチャ を追加することができる.カスタム「タッチボール」画像と背景画像 指は制御盤の範囲を外し、 に追従することができる.は、移動位置のパーセンテージパラメータ を取得することができる.
実現構想.
このホイールをカスタムビューで実現します.
ハンドルの基本的な要求は指に従って反応することです.指のタッチパネルの座標を取得するには、Viewの
コントロールの「タッチボール」と背景は画像から得られます.カスタムviewで対応するbitmapを取得し、指定したサイズにスケールします.
コードの例
スタイルの設定
固定とフローティングの2つのスタイルがあり、将来的には追加される可能性があります.
ホイールの構成項目は比較的多く、
左ハンドルを作成します.各寸法構成を入力します.最後に
イニシャルマネージャ
イニシャルマネージャ、ホイールの作成
コントローラによるListenerの設定
より美しく、より魅力的なコントロールを作るには、良い審美レベルが必要です.
ハンドルのようなコントロールをカスタマイズするには、Viewをカスタマイズします.
関連コードはgithubを参照してください.com/RustFisher/…
Joystickmiew特性
現在Joystickmiewの特性は以下の通りである.
実現構想.
このホイールをカスタムビューで実現します.
TouchView
を作成します.ハンドルの基本的な要求は指に従って反応することです.指のタッチパネルの座標を取得するには、Viewの
onTouchEvent
メソッドが使用されます.コントロールの「タッチボール」と背景は画像から得られます.カスタムviewで対応するbitmapを取得し、指定したサイズにスケールします.
onTouchEvent
で対応する座標を取得し、ピクチャが現れるべき位置を算出する.onDraw
で座標に基づいて描画されます.指の位置とホイールの中心との距離などの情報を算出し,listenerを介して伝達する.コードの例
スタイルの設定
固定とフローティングの2つのスタイルがあり、将来的には追加される可能性があります.
public enum PadStyle {
FLOATING /* */,
FIXED /* */
}
ホイール構成TouchView
を直接操作することなく、TouchViewModel
に関連する構成を作成することができます. private int bgResId; // ID
private int touchBmpResId; // ID -
private int directionPicResId; // ID
private float mWholeViewWid; // View
private float mWholeViewHeight; // View
private float mWholePadWid; // , ; View
private float mWholePadHeight; // , ; View
private int mRoundBgRadius; //
private int mTouchBallRadius = 100; //
private int mRoundBgPadding; // Pad px
private boolean showDirectionPic = false; //
private PadStyle mPadStyle = PadStyle.FIXED; //
private PadLocationType mPadLocationType = PadLocationType.LEFT_BOT;
// .........
ホイールマネージャホイールの構成項目は比較的多く、
DefaultController
を抽象化してホイールを管理する.このコントローラは必要ありません.マネージャには、RelativeLayoutを使用するホイールがある親Viewが必要です.左ハンドルを作成します.各寸法構成を入力します.最後に
containerView
に追加されました. private void createLeftControlTouchView() {
TouchViewModel model = new TouchViewModel(
R.drawable.ui_pic_joystick_left_pad,
R.drawable.ui_pic_joystick_control_ball);
model.setWholeViewSize(ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_wid),
ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_height));
model.setPadSize(ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_pad_size),
ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_pad_size));
int roundBgRadius = ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_round_bg_radius);
model.setContentSize(roundBgRadius, (int) (roundBgRadius / 3.5));
model.setStyle(padStyle, PadLocationType.LEFT_BOT);
model.setRoundBgPadding(ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_circle_bg_padding));
leftControlTouchView = new TouchView(ctx);
leftControlTouchView.init(model);
// View
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_wid),
ctx.getResources().getDimensionPixelSize(R.dimen.ui_joystick_whole_field_height)
);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
leftControlTouchView.setLayoutParams(params);
}
// ............
createLeftControlTouchView();
containerView.addView(leftControlTouchView);
マネージャの初期化には、ホイールをマウントするためにView Groupが必要です. public DefaultController(Context context, RelativeLayout containerView, PadStyle padStyle) {
this.ctx = context;
this.containerView = containerView;
this.padStyle = padStyle;
}
Fragmentでの使用イニシャルマネージャ
イニシャルマネージャ、ホイールの作成
mDefaultController =
new DefaultController(getContext(),
(RelativeLayout) root.findViewById(R.id.joystick_container));
mDefaultController.createViews();
mDefaultController.showViews(false);
Listenerの設定、ユーザーの操作情報の取得コントローラによるListenerの設定
mDefaultController.setLeftTouchViewListener(new JoystickTouchViewListener() {
@Override
public void onTouch(float horizontalPercent, float verticalPercent) {
Log.d(TAG, "onTouch left: " + horizontalPercent + ", " + verticalPercent);
}
@Override
public void onReset() {
Log.d(TAG, "onReset: left");
}
@Override
public void onActionDown() {
Log.d(TAG, "onActionDown: left");
}
@Override
public void onActionUp() {
Log.d(TAG, "onActionUp: left");
}
});
これで、簡単なホイールコントロールを実現しました.このコントロールは、いくつかの制御クラスアプリケーションで使用できます.より美しく、より魅力的なコントロールを作るには、良い審美レベルが必要です.