Android-Joystickmiew仮想ハンドル、ホイール、カスタムUI

8672 ワード

一部の携帯電話ゲームでは、プレイヤーは仮想制御盤を通じてゲームキャラクターの行動を制御することができる.無人機や玩具操作アプリにもこのような制御盤の応用がある.
ハンドルのようなコントロールをカスタマイズするには、Viewをカスタマイズします.
関連コードはgithubを参照してください.com/RustFisher/…
Joystickmiew特性
現在Joystickmiewの特性は以下の通りである.
  • 2スタイル
  • 固定制御盤;
  • フローティング追従モード;ハンドルは指が最初にクリックした場所
  • に移動します.
  • は、背景に「矢印」、すなわち効果ピクチャ
  • を追加することができる.
  • カスタム「タッチボール」画像と背景画像
  • 指は制御盤の範囲を外し、
  • に追従することができる.
  • は、移動位置のパーセンテージパラメータ
  • を取得することができる.
    実現構想.
    このホイールをカスタムビューで実現します.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");
                }
            });
    
    これで、簡単なホイールコントロールを実現しました.このコントロールは、いくつかの制御クラスアプリケーションで使用できます.
    より美しく、より魅力的なコントロールを作るには、良い審美レベルが必要です.