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.自定義圖片選擇器
軟件架構
軟件架構使用說明
安裝教程
- 將arr包導入項目中
使用說明
- 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即可
- 視頻壓縮使用方法
/**
* 壓縮視頻
*
* @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,
};
- 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));
}
}
-
Zbardecoder使用方法
生成二維碼:QRCodeUtil.createQRImage(tv_order_detail_address_center.getText().toString(), widthPix, heightPix, null)
識別二維碼:
-
相機的訪問權限別忘了
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) {
}
}
- 自定義圖片選擇器使用方法:
首先感謝: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裏面的數據就是選中的圖片的文件路徑。
如有需要:可以跟我發郵件,郵件地址在代碼中,謝謝;