AndroidオープンソースフレームワークCommentBottomBar下部コメント弾窓

7214 ワード

前言
通常、ソーシャルタイプのアプリでは、コメントに文字や文字+画像を付ける必要があります.このニーズに対応したコントロールCommentBottomBarを設計しました.プロジェクトはすでにGithubを発表して、Starを歓迎します!Githubアドレス:https://github.com/EverZc/CommentBottomBar
目次
  • 効果図
  • 使用手順
  • 一般的な方法
  • 実現原理
  • 1.効果図
    効果の例
    2.使用手順
    Step 1.依存CommentBottomBarの追加
    まず、プロジェクトのルートbuild.gradleに追加します.
    allprojects {
        repositories {
            maven { url "https://jitpack.io" }
        }
    }
    

    次に依存するmoduleに追加します
    dependencies {
        implementation 'com.github.EverZc:CommentBottomBar:latest.release.here'
    }
    

    Step 2.プロセスの使用
    CommentBottomBarはとても使いやすいです
        //   :             
        ZBottomSheetPictureBar commentZBSP = ZBottomSheetPictureBar.delegation(MainActivity.this);
        //   :       ,   EditText hint
        commentZBSP.show("       ");
        //   :          (          )
        commentZBSP.setOnSeetBarOnClickListener(new ZBottomSheetPictureBar.OnSheetBarOnClickListener() {
            @Override
            public void onAddClick() {
                Intent intent = new Intent(MainActivity.this, ImagePickActivityPicker.class);
                intent.putExtra(IS_NEED_CAMERA, true);
                int maxNumber = commentZBSP.getAdapterData().isEmpty() ?
                        ZBottomConstant.ARTICLE_IMAGE_MAX : ZBottomConstant.ARTICLE_IMAGE_MAX - commentZBSP.getAdapterData().size();
                intent.putExtra(FilePicker.MAX_NUMBER, maxNumber);
                startActivityForResult(intent, ZBottomConstant.REQUEST_CODE_PICK_IMAGE);
            }
    
            @Override
            public void onCommitClick(ArrayList images, EditText editText) {
              //       ,               
            }
        });
    
        //   :       ,        。
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case ZBottomConstant.REQUEST_CODE_PICK_IMAGE:
                    //       
                    if (resultCode == RESULT_OK) {
                        ArrayList imageList = data.getParcelableArrayListExtra(FilePicker.RESULT_PICK_IMAGE);
                        commentZBSP.setImages(imageList);
                    }
                    break;
            }
        }
    

    3.一般的な方法
    メソッド名
    説明
    delegation(Context context)
    作成方法
    show(String hint)
    コメントボックスをポップアップし、コメントのhintを記入します.
    dismiss()
    コメントポップアップボックスを非表示にし、ソフトキーボードを非表示にします.
    setImages(ArrayList images)
    画像の追加
    getAdapterData()
    現在のコメントボックスの画像を取得
    getAdapter()
    ポップアップ画像のadapterを取得
    getCommentText()
    コメントの取得
    clear()
    コメントテキストの内容とコメントの画像の内容を整理します
    4.実現原理
    ZBottomDialog説明
    この下部コメントポップアップボックスは、下部ポップアップボックスとして、Material DesignのBottomSheetBehaviorを採用しています.まず、使用した関連内容を簡単に理解します.BottomSheetBehaviorポップアップには、次の5つの状態があります.
  • STATE_COLLAPSED:折りたたみ状態で、bottom sheetsは下部にレイアウトの一部しか表示されません.表示高さはapp:behavior_peekHeight設定(本フレームは設定されていません);
  • STATE_DRAGGING:移行状態で、ユーザーがbottom sheetを上または下にドラッグしている.
  • STATE_SETTLING:指の離脱から最終停止までの時間
  • を表示する.
  • STATE_EXPANDED:完全展開状態
  • STATE_HIDDEN:非表示状態.デフォルトはfalseですapp:behavior_hideableプロパティ設定が
  • を非表示にできるかどうか
    なぜBottomSheetDialog関連の方法を書き換えるのですか?BottomSheetDialogをそのまま使うと2つの問題が発生します
  • BottomSheetDialogを初期化すると、インタフェースにはコメント文字のみが表示され、コメントの下のピクチャコンテンツのRecyclerView部分は
  • が表示されるまで単独で引っ張る必要がある.
  • コメントやコメント画像をスライドさせた後、コントロールのviewは隠されたが、ソフトキーボードは隠されず、dialog全体が閉じられなかった.

  • 問題1解決:現在のdialogのスタイルを設定する必要がある:android:windowIsFloatingはfalse android:windowSoftInputModeはadjustResizeでなければ表示不全になる
    
    

    問題2解決:まずBottomSheetBehaviorを取得してからBottomSheetBehaviorを設定する必要がある.BottomSheetCallback()のonStateChangedメソッドは単独で動作し、このとき状態newStateはBottomSheetBehaviorではない.STATE_HIDDENの場合、つまり隠し状態に入り、BottomSheetDialogのdismiss()メソッドを実行すればよい.
    完全なコードは次のとおりです.
    public class ZBottomDialog extends BottomSheetDialog {
        private BottomSheetBehavior behavior;
    
        public ZBottomDialog(@NonNull Context context) {
            super(context, R.style.bottomSheetEdit);
        }
    
        @Override
        public void setContentView(View view) {
            super.setContentView(view);
            initialize(view);
        }
        private void initialize(final View view) {
            ViewGroup parent = (ViewGroup) view.getParent();
            CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parent.getLayoutParams();
            behavior = (BottomSheetBehavior) params.getBehavior();
            behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                @Override
                public void onStateChanged(@NonNull View bottomSheet, int newState) {
                    if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                        dismiss();
                    }
                }
    
                @Override
                public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                }
            });
        }
    }
    

    ZBottomSheetAdapter解釈説明
    このアダプタの主な機能は、下部のコメントウィンドウの画像recyclerview用のadapterです.このadapterには2種類のItemViewタイプがあります(0:画像を追加し、1:画像を表示します)
    //         ,     adapter holder
    public void setOnReleaseImageListener(ZBottomSheetHolder.OnReleaseImageListener onReleaseImageListener) {
            this.onReleaseImageListener = onReleaseImageListener;
        }
    
    public interface OnReleaseImageListener {
        //         
        void onAddClick();
        //         
        void onDelClick(ImageFile imageFile, int position);
        //           (                       )
        void onClick(int positon);
    }
    

    ZBottomSheetAdapter Holderの説明
    このコントロールの設計当初、adapterはGridLayoutManager spanCount=3を使用し、特定のitemは正方形の設計を採用していたため、holderで特殊な処理処理を行う必要があります.構造関数では現在のitemの幅を取得し、画像をロードする際にglideを使用して現在の図面にロードされている幅を処理します.
        //     item  ,    item      
        private int getItemWidth(){
            WindowManager windowManager = (WindowManager) mContext
                    .getSystemService(Context.WINDOW_SERVICE);
            return  windowManager.getDefaultDisplay().getWidth();
        }
    

    このholderのリスニングメソッドインタフェースの内容:
        public interface OnReleaseImageListener {
            //         
            void onAddClick();
            //         
            void onDelClick(ImageFile imageFile, int position);
            //           (                       )
            void onClick(int positon);
        }
    
        //  item    ,  glide         
        public void setData(ImageFile imageFile) {
            mImageFile = imageFile;
            Glide.with(mContext)
                    .load(imageFile.getPath())
                    .diskCacheStrategy(DiskCacheStrategy.RESULT)
                    .override(mWidth, mWidth)//      px
                    .into(mCoverView);
        }
    

    まとめ
    開発中に多くのオープンソースのものが現在のビジネスを満たすとは限らない場合があります.このコントロールの部分は、多くの人の実装方法を参考にしてカスタマイズされています.オープンソースの過程でできるだけコードの規範と可読性を保証し、読者の理解を容易にする.皆さんのご指摘を歓迎します~