BaseMvp封裝

BaseMvp

aar文件下載路徑:https://download.csdn.net/download/lvzhongdi/10675962

項目介紹

使用MVP架構
1.Rxjava

2.RxAndroid

3.Retrofit

4.Glide

5.七牛的視頻壓縮處理

6.SmartRefreshLayout:1.0.4上拉加載框架

7.Zbardecoder 的二維碼掃描

8.自定義圖片選擇器

軟件架構

軟件架構使用說明

安裝教程

  1. 將arr包導入項目中

使用說明

  1. Base系列使用說明
 1.創建一個Contract
 2.創建Presenter
 3.創建Actvitity或者Fragment
 具體實現如下:
 1).MainContract
 /**
 * 作者:created by albert on 2018/9/18 16:29
 * 郵箱:[email protected]
 *
 * @param
 **/
public interface MainContract {

    interface View extends BaseContract.BaseView{}

     interface Presenter extends BaseContract.BasePresenter<View>{

     }
}

2).MainPresent
/**
 * 作者:created by albert on 2018/9/18 16:29
 * 郵箱:[email protected]
 *
 * @param
 **/
public class MainPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter {
}
3).MainActivity
public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.View{
	 @Override
    protected void initView() {
    }
     @Override
    protected MainPresenter initPresenter() {
        return null;
    }
      @Override
    protected int getActivityLayoutID() {
        return R.layout.activity_main;
    }

}

說明:如果是Activity,繼承我所封裝的BaseActivity ,如果是Fragment 繼承我所封裝的BaseFragment即可

  1. 視頻壓縮使用方法
  /**
     * 壓縮視頻
     *
     * @param mContext 
     * @param filepath 需要壓縮的視頻文件路徑
     * @param newPath  壓縮文件所要保存的文件路徑
     */
    public void compressVideoResouce(Context mContext,String filepath,String newPath ) {
        if (TextUtils.isEmpty(filepath)) {
            CommonUtil.showToast("請先選擇轉碼文件!");
            return;
        }
        //PLShortVideoTranscoder初始化,三個參數,第一個context,第二個要壓縮文件的路徑,第三個視頻壓縮後輸出的路徑
        PLShortVideoTranscoder mShortVideoTranscoder = new PLShortVideoTranscoder(mContext, filepath, newPath+System.currentTimeMillis() + ".mp4");
        MediaMetadataRetriever retr = new MediaMetadataRetriever();
        retr.setDataSource(filepath);
        String height = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 視頻高度
        String width = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 視頻寬度
        String rotation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 視頻旋轉方向
        int transcodingBitrateLevel = 6;//我這裏選擇的2500*1000壓縮,這裏可以自己選擇合適的壓縮比例
        mShortVideoTranscoder.transcode(Integer.parseInt(width), Integer.parseInt(height), getEncodingBitrateLevel(transcodingBitrateLevel), false, new PLVideoSaveListener() {
            @Override
            public void onSaveVideoSuccess(String s) {
                Log.e("lv", "s" + s+"就是轉換之後的文件路徑");
            }
            @Override
            public void onSaveVideoFailed(final int errorCode) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        switch (errorCode) {
                            case ERROR_NO_VIDEO_TRACK:
                                CommonUtil.showToast("該文件沒有視頻信息!");
                                break;
                            case ERROR_SRC_DST_SAME_FILE_PATH:
                                CommonUtil.showToast("源文件路徑和目標路徑不能相同!");
                                break;
                            case ERROR_LOW_MEMORY:
                                CommonUtil.showToast("手機內存不足");
                                break;
                            default:
                                CommonUtil.showToast("failed: " + errorCode);
                        }
                    }
                });
            }
            @Override
            public void onSaveVideoCanceled() {
                Log.e("lv", "onSaveVideoCanceled");
            }
            @Override
            public void onProgressUpdate(float percentage) {
                Log.e("lv", "onProgressUpdate");
            }
        });
    }
 /**
     * 設置壓縮質量
     *
     * @param position
     * @return
     */
    private int getEncodingBitrateLevel(int position) {
        return ENCODING_BITRATE_LEVEL_ARRAY[position];
    }

    /**
     * 選的越高文件質量越大,質量越好
     */
    public static final int[] ENCODING_BITRATE_LEVEL_ARRAY = {
            500 * 1000,
            800 * 1000,
            1000 * 1000,
            1200 * 1000,
            1600 * 1000,
            2000 * 1000,
            2500 * 1000,
            4000 * 1000,
            8000 * 1000,
    };
  1. SmartRefreshLayout使用方法
    佈局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/fragment_find_smartref"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/fragment_find_recycle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:orientation="vertical"
            android:overScrollMode="never"
            android:scrollbars="none"
            tools:showIn="@layout/activity_home" />

    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
</LinearLayout>

**創建Application 直接繼承我的UtilsApp即可

代碼實現部分:

smartRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(RefreshLayout refreshlayout) {
             
            }
        });
        smartRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
            @Override
            public void onLoadmore(RefreshLayout refreshlayout) {
           
            }
        });

在Base的基類中,還包含了RecycleAdapter和BaseAdapter的基類;具體繼承和使用如下:

/**
 * 作者:create by albert on 2018/9/9 下午2:23
 * 郵箱:[email protected]
 * 這個是RecycleView的
 */
public class HomeAdapter extends BaseAdapter<String> {

    @Override
    protected int bindLayout(int viewType) {
        return R.layout.item_home;
    }

    @Override
    protected void bind(BaseViewHolder holder, String data) {
        TextView textView = holder.itemView.findViewById(R.id.textview);
        textView.setText(data);
    }
}
private class FindViewGridViewAdapter extends BAdapter<String> {

        private Context con;

        public FindViewGridViewAdapter(Context context, List<String> list) {
            super(context, list);
            con = context;
        }

        @Override
        public int getContentView() {
            return R.layout.item_find_context;
        }

        @Override
        public void onInitView(View view, int position) {
            TextView textView = view.findViewById(R.id.item_find_content_tv);
            FindResModel.DataBean.PageListBean.GListBean bean = getItem(position);
            textView.setText(list.get(position));
        }
    }
  1. Zbardecoder使用方法
    生成二維碼:

    QRCodeUtil.createQRImage(tv_order_detail_address_center.getText().toString(), widthPix, heightPix, null)
    

    識別二維碼:

  2. 相機的訪問權限別忘了

       XPermission.getPermissions(this, permission, true, true, new OnPermissionsListener() {
                   @Override
                   public void missPermission(String[] strings) {
                       if (strings.length == 0) {
                           startActivityForResult(new Intent(this, CaptureActivity.class), REQUEST_CODE);
                       }
                   }
               });

2.同樣的,返回的時候要進行值的處理

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if ( requestCode == REQUEST_CODE) {
                }
            }
  1. 自定義圖片選擇器使用方法:

首先感謝:https://github.com/donkingliang/ImageSelector 這個人

   a.添加權限
    //儲存卡的讀寫權限
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    //調用相機權限
    <uses-permission android:name="android.permission.CAMERA" />
    b.添加activity和7.0以後的文件訪問
    //圖片選擇Activity
    <activity android:name=".ImageSelectorActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        android:configChanges="orientation|keyboardHidden|screenSize"/>
    //圖片預覽Activity
    <activity android:name=".PreviewActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        android:configChanges="orientation|keyboardHidden|screenSize"/>
    //圖片剪切Activity
    <activity
        android:name=".ClipImageActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    <!-- Android 7.0 文件共享配置,必須配置 -->
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
    c.在res/xml文件夾下創建file_paths.xml文件(名字可以自己定義)
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <!-- 這個是保存拍照圖片的路徑,必須配置。 -->
        <external-path
            name="images"
            path="Pictures" />
    </paths>
    d.調圖片選擇器
      說明:ImageSelector支持圖片的單選、限數量的多選和不限數量的多選。還可以設置是否使用相機、是否剪切圖片等配置。ImageSelector提供了統一的調起相冊的方法。
  1)單選           
   ImageSelector.builder()
          .useCamera(true) // 設置是否使用拍照
          .setSingle(true)  //設置是否單選
  	.setViewImage(true) //是否點擊放大圖片查看,,默認爲true
          .start(this, REQUEST_CODE); // 打開相冊

 2)限數量的多選(比喻最多9張)
  ImageSelector.builder()
          .useCamera(true) // 設置是否使用拍照
          .setSingle(false)  //設置是否單選
          .setMaxSelectCount(9) // 圖片的最大選擇數量,小於等於0時,不限數量。
  	.setSelected(selected) // 把已選的圖片傳入默認選中。
  	.setViewImage(true) //是否點擊放大圖片查看,,默認爲true
          .start(this, REQUEST_CODE); // 打開相冊3)不限數量的多選

  ImageSelector.builder()
          .useCamera(true) // 設置是否使用拍照
          .setSingle(false)  //設置是否單選
          .setMaxSelectCount(0) // 圖片的最大選擇數量,小於等於0時,不限數量。
  	.setSelected(selected) // 把已選的圖片傳入默認選中。
  	.setViewImage(true) //是否點擊放大圖片查看,,默認爲true
          .start(this, REQUEST_CODE); // 打開相冊

	3)單選並剪裁

  ImageSelector.builder()
         .useCamera(true) // 設置是否使用拍照
         .setCrop(true)  // 設置是否使用圖片剪切功能。
         .setSingle(true)  //設置是否單選
         .setViewImage(true) //是否點擊放大圖片查看,,默認爲true
         .start(this, REQUEST_CODE); // 打開相冊

e.REQUEST_CODE就是調用者自己定義的啓動Activity時的requestCode,這個相信大家都能明白。selected可以在再次打開選擇器時,把原來已經選擇過的圖片傳入,使這些圖片默認爲選中狀態。

f.接收選擇器返回的數據在Activity的onActivityResult方法中接收選擇器返回的數據。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && data != null) {
	    //獲取選擇器返回的數據
            ArrayList<String> images = data.getStringArrayListExtra(
            ImageSelectorUtils.SELECT_RESULT);
        }
    }

總結:ImageSelectorUtils.SELECT_RESULT是接收數據的key。數據是以ArrayList的字符串數組返回的,就算是單選,返回的也是ArrayList數組,只不過這時候ArrayList只有一條數據而已。ArrayList裏面的數據就是選中的圖片的文件路徑。

如有需要:可以跟我發郵件,郵件地址在代碼中,謝謝;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章