nilupeng
2022-08-11 6c29fda2b7408c13a486554c5be9d3c6b8296b95
设置界面
3 files added
1 files deleted
23 files modified
491 ■■■■ changed files
app/src/main/AndroidManifest.xml 3 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java 152 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/base/model/ImpViewModel.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/config/Configuration.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/data/ApkUpGradeResult.java 29 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/data/Results.java 8 ●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java 7 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/AboutActivity.java 21 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/SettingActivity.java 46 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageFragments.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/main/MainActivity.java 19 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java 15 ●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java 4 ●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/main/service/ServiceFragment.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/util/HandleDate.java 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java 53 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_about.xml 66 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_login.xml 3 ●●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_main.xml 2 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_setting.xml 24 ●●●● patch | view | raw | blame | history
app/src/main/res/values/strings.xml 4 ●●●● patch | view | raw | blame | history
app/src/main/res/values/styles.xml 15 ●●●●● patch | view | raw | blame | history
app/src/main/AndroidManifest.xml
@@ -45,6 +45,9 @@
        <activity android:name=".ui.main.MainActivity" />
        <activity android:name=".ui.login.RegisterLoginActivity" />
        <activity android:name=".ui.web.WebViewActivity" />
        <activity android:name=".ui.SettingActivity" />
        <activity android:name=".ui.AboutActivity" />
    </application>
</manifest>
app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java
@@ -82,7 +82,7 @@
            RESULT_CODE_SUCESS = 4046/*成功*/,
            RESULT_CODE_CANCEL = 4043/*取消*/;
    protected Context mContext;
    TitleBarView titleBarView;
    protected TitleBarView titleBarView;
    @Override
app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
@@ -1,16 +1,31 @@
package com.runt.open.mvvm.base.model;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.content.FileProvider;
import androidx.lifecycle.ViewModel;
import com.runt.open.mvvm.BuildConfig;
import com.runt.open.mvvm.base.activities.BaseActivity;
import com.runt.open.mvvm.data.HttpApiResult;
import com.runt.open.mvvm.data.Results;
import com.runt.open.mvvm.listener.ResPonse;
import com.runt.open.mvvm.retrofit.AndroidScheduler;
import com.runt.open.mvvm.retrofit.api.CommonApiCenter;
import com.runt.open.mvvm.retrofit.observable.HttpObserver;
import com.runt.open.mvvm.retrofit.utils.RetrofitUtils;
import io.reactivex.Observable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import okhttp3.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
 * Created by Administrator on 2021/11/11 0011.
@@ -24,6 +39,139 @@
        this.mActivity = activity;
    }
    public void checkUpdate(boolean showTip){
        Observable<HttpApiResult<Results.ApkVersion>> appUpdate = commonApi.getAppUpdate();
        HttpObserver<Results.ApkVersion> observer = new HttpObserver<Results.ApkVersion>(mActivity) {
            @Override
            protected void onSuccess(Results.ApkVersion version) {
                if (version.code > BuildConfig.VERSION_CODE) {
                    mActivity.showDialog("有新版本", version.detail, "升级", "取消", new ResPonse() {
                        @Override
                        public void doSuccess(Object obj) {
                            String downloadUrl = version.access.indexOf("http")> -1? version.access:BuildConfig.HOST_IP_ADDR + version.access;
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                boolean hasInstallPermission = mActivity.getPackageManager().canRequestPackageInstalls();
                                if (!hasInstallPermission) {
                                    mActivity.showDialog("当前没有安装权限", "当前没有安装权限", "去设置", "稍后安装", new ResPonse() {
                                        @Override
                                        public void doSuccess(Object obj) {
                                            //跳转至“安装未知应用”权限界面,引导用户开启权限
                                            Uri selfPackageUri = Uri.parse("package:" + mActivity.getPackageName());
                                            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri);
                                            mActivity.startActivity(intent);
                                        }
                                    });
                                    return;
                                }
                            }
                            downloadApk(downloadUrl);
                        }
                    });
                }else if(showTip){
                    mActivity.showToast("当前是最新版本");
                }
            }
        };
        if(showTip){
            httpObserverOnLoading(appUpdate, observer);
        }else{
            httpObserverOn(appUpdate,observer);
        }
    }
    private void downloadApk(String url){
        Request request = new Request.Builder().url(url).build();
        OkHttpClient client = new OkHttpClient();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                mActivity.showToast("下载失败"+e);
            }
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                int code = response.code();
                Log.d("downloadFile", "code:"+code);
                if(code != 200){
                    mActivity.showToast("下载失败"+code);
                    return;
                }
                FileOutputStream fos = null;
                InputStream input = null;
                File file = null;
                byte[] buf = new byte[2048];
                int len = 0;
                try {
                    Log.d("downloadFile", "下载文件:"+url);
                    input = response.body().byteStream();
                    long total = response.body().contentLength();
                    Log.d("downloadFile", "total:"+total);
                    file = new File(mActivity.getExternalFilesDir(null).getAbsolutePath() + "/");
                    if (!file.exists()) {
                        file.mkdirs();
                    }
                    file = new File(file.getPath() + "/" + url.substring(url.lastIndexOf("/")));
                    file.createNewFile();
                    fos = new FileOutputStream(file);
                    long sum = 0;
                    while ((len = input.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                        sum += len;
                        float progress = (sum * 1.0f / total * 100);
                        // 下载中
                        Log.d("downloadFile", "下载进度:" + progress);
                    }
                    Log.d("downloadFile", file.getPath());
                    // 下载完成
                    File finalFile = file;
                    mActivity.runOnUiThread(() -> {
                        mActivity.showDialog("安装", "新版安装包下载完成", "安装", "取消", new ResPonse() {
                            @Override
                            public void doSuccess(Object obj) {
                                openAPK(finalFile);
                            }
                        });
                    });
                } catch (Exception e) {
                    Log.d("downloadFileException", e.toString());
                    Log.d("downloadFileException", "Url:${call.request().url}");
                    mActivity.showToast("下载失败"+e);
                    file.delete();
                    call.cancel();
                } finally {
                    fos.flush();
                    input.close();
                    fos.close();
                }
            }
        });
    }
    /**
     * 打开apk文件
     *
     * @param file
     */
    private void openAPK(File file) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        Uri photoURI = null;
        if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            photoURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".fileprovider", file);//添加这一句表示对目标应用临时授权该Uri所代表的文件
        } else {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            photoURI = Uri.fromFile(file);
        }
        intent.setDataAndType(photoURI, "application/vnd.android.package-archive");
        mActivity.startActivity(intent);
    }
    /**
     * 网络请求观察
     * @param observable
app/src/main/java/com/runt/open/mvvm/base/model/ImpViewModel.java
@@ -1,7 +1,7 @@
package com.runt.open.mvvm.base.model;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class ImpViewModel extends BaseViewModel{
}
app/src/main/java/com/runt/open/mvvm/config/Configuration.java
@@ -3,7 +3,7 @@
/**
 * My father is Object, ites purpose of
 *
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class Configuration {
app/src/main/java/com/runt/open/mvvm/data/ApkUpGradeResult.java
File was deleted
app/src/main/java/com/runt/open/mvvm/data/Results.java
@@ -3,7 +3,7 @@
/**
 * My father is Object, ites purpose of
 *
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class Results {
@@ -17,4 +17,10 @@
        public String id,title,content,cTime;
    }
    //版本更新
    public class ApkVersion{
        public long id,code;
        public String version,detail,access;
    }
}
app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
@@ -1,7 +1,6 @@
package com.runt.open.mvvm.retrofit.api;
import com.runt.open.mvvm.data.ApkUpGradeResult;
import com.runt.open.mvvm.data.HttpApiResult;
import com.runt.open.mvvm.data.PageResult;
import com.runt.open.mvvm.data.Results;
@@ -54,11 +53,11 @@
     * app更新
     * @return
     */
    @GET("system/appupgrade/tourist/get/2")
    Observable<ApkUpGradeResult> getAppUpdate();
    @GET("getControlVersion")
    Observable<HttpApiResult<Results.ApkVersion>> getAppUpdate();
    @POST("updateName")
    Observable<ApkUpGradeResult> updateName(@Field("username") String name);
    Observable<Results.StringApiResult> updateName(@Field("username") String name);
    @Multipart
    @POST("updatehead")
app/src/main/java/com/runt/open/mvvm/ui/AboutActivity.java
New file
@@ -0,0 +1,21 @@
package com.runt.open.mvvm.ui;
import com.runt.open.mvvm.base.activities.BaseActivity;
import com.runt.open.mvvm.base.model.ImpViewModel;
import com.runt.open.mvvm.databinding.ActivityAboutBinding;
import com.runt.open.mvvm.util.DeviceUtil;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class AboutActivity extends BaseActivity<ActivityAboutBinding, ImpViewModel> {
    @Override
    public void initViews() {
        mBinding.txtVer.setText("版本号 "+ DeviceUtil.getAppVersionName(mContext));
    }
    @Override
    public void loadData() {
    }
}
app/src/main/java/com/runt/open/mvvm/ui/SettingActivity.java
New file
@@ -0,0 +1,46 @@
package com.runt.open.mvvm.ui;
import android.content.Intent;
import android.view.View;
import com.runt.open.mvvm.BuildConfig;
import com.runt.open.mvvm.base.activities.BaseActivity;
import com.runt.open.mvvm.base.model.ImpViewModel;
import com.runt.open.mvvm.config.Configuration;
import com.runt.open.mvvm.databinding.ActivitySettingBinding;
import com.runt.open.mvvm.listener.ResPonse;
import com.runt.open.mvvm.ui.login.UserBean;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class SettingActivity extends BaseActivity<ActivitySettingBinding, ImpViewModel> {
    @Override
    public void initViews() {
        setTitle("设置");
        if(UserBean.getUser() == null){
            mBinding.logout.setVisibility(View.GONE);
        }
        mBinding.version.setText(BuildConfig.VERSION_NAME);
        mBinding.version.setOnClickListener(v->{
            mViewModel.checkUpdate(true);
        });
        mBinding.about.setOnClickListener(v->{startActivity(new Intent(mContext,AboutActivity.class));});
        mBinding.logout.setOnClickListener(v->{
            showDialog("是否退出", "退出后将清除本设备的登录信息", new ResPonse() {
                @Override
                public void doSuccess(Object obj) {
                    clearUserData();
                    putStringProjectPrefrence(Configuration.KEY_USERINFO,null);
                    UserBean.setUser(null);
                    setResult(RESULT_CODE_SUCESS);
                    finish();
                }
            });
        });
    }
    @Override
    public void loadData() {
    }
}
app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java
@@ -1,7 +1,7 @@
package com.runt.open.mvvm.ui.loadpage;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class PageActivitys {
}
app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageFragments.java
@@ -6,7 +6,7 @@
import com.runt.open.mvvm.ui.main.home.MsgAdapter;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class PageFragments {
app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java
@@ -8,7 +8,7 @@
import io.reactivex.Observable;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class PageViewModels {
    public static class HomeViewModel extends LoadPageViewModel<Results.Message> {
app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
@@ -20,7 +20,7 @@
/**
 * My father is Object, ites purpose of
 *
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class RegisterLoginActivity extends BaseActivity<ActivityLoginBinding,LoginViewModel> {
    final String VERIFY_CODE = "verify_code";
app/src/main/java/com/runt/open/mvvm/ui/main/MainActivity.java
@@ -5,11 +5,9 @@
import android.content.res.ColorStateList;
import android.view.KeyEvent;
import android.view.View;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.permissionx.guolindev.PermissionX;
import com.runt.open.mvvm.R;
@@ -20,6 +18,7 @@
import com.runt.open.mvvm.databinding.ActivityMainBinding;
import com.runt.open.mvvm.listener.CustomClickListener;
import com.runt.open.mvvm.listener.ResPonse;
import com.runt.open.mvvm.ui.SettingActivity;
import com.runt.open.mvvm.ui.loadpage.PageFragments;
import com.runt.open.mvvm.ui.login.RegisterLoginActivity;
import com.runt.open.mvvm.ui.login.UserBean;
@@ -41,12 +40,18 @@
    @Override
    public void initViews() {
        mBinding.titleBar.setRightDra(getResources().getDrawable(R.mipmap.icon_white_setting));
        mBinding.titleBar.setRightClick(new CustomClickListener() {
        ActivityResultLauncher<Intent>  settingLaunch = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if(result.getResultCode() == RESULT_CODE_SUCESS){//已退出
                if(mBinding.viewPager2.getCurrentItem() == 2) {
                    mBinding.viewPager2.setCurrentItem(0);//设置默认第二页
                }
                fragments[2].loadData();//登录后重新刷新
            }
        });
        titleBarView.setRightClick(new CustomClickListener() {
            @Override
            protected void onSingleClick(View view) {
                //startActivityForResult(new Intent(mContext,SettingActivity.class),REQUEST_CODE_LOGOUT);//打开设置
                settingLaunch.launch(new Intent(mContext, SettingActivity.class));//打开设置
            }
        });
        final FragmentAdapter fragmentAdapter = new FragmentAdapter(this);
@@ -109,7 +114,7 @@
    private void setTitleStr(int position){
        switch (position){
            case 0:
                setTitle("资讯");
                setTitle("资讯Aljkpqla");
                break;
            case 1:
                setTitle("服务");
app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java
@@ -5,7 +5,7 @@
/**
 * My father is Object, ites purpose of
 *
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/28.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class MainViewModel extends BaseViewModel {
}
app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
@@ -3,7 +3,6 @@
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.util.Log;
import android.view.View;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
@@ -14,17 +13,11 @@
import com.runt.open.mvvm.BuildConfig;
import com.runt.open.mvvm.R;
import com.runt.open.mvvm.base.fragments.BaseFragment;
import com.runt.open.mvvm.data.HttpApiResult;
import com.runt.open.mvvm.data.Results;
import com.runt.open.mvvm.databinding.FragmentMineBinding;
import com.runt.open.mvvm.retrofit.observable.HttpObserver;
import com.runt.open.mvvm.ui.login.UserBean;
import com.runt.open.mvvm.util.GlideEngine;
import com.runt.open.mvvm.util.MyLog;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import java.io.File;
import java.util.List;
@@ -71,11 +64,11 @@
                openAlthum();
                break;
            case R.id.txt_name://名称
                mViewModel.updateName(new HttpObserver() {
                mViewModel.updateName(new HttpObserver<String>() {
                    @Override
                    protected void onSuccess(Object data) {
                        UserBean.getUser().setUsername(data.toString());
                        mBinding.txtName.setText(data.toString());
                    protected void onSuccess(String data) {
                        UserBean.getUser().setUsername(data);
                        mBinding.txtName.setText(data);
                    }
                });
app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java
@@ -13,11 +13,11 @@
import java.io.File;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class MineViewModel extends BaseViewModel {
    public void updateName(HttpObserver observer){
    public void updateName(HttpObserver<String> observer){
        if(UserBean.getUser().getPhone().equals(UserBean.getUser().getUsername())) {
            mActivity.showInputDialog("输入名称", UserBean.getUser().getUsername(), "名称只能修改一次", new ResPonse() {
                @Override
app/src/main/java/com/runt/open/mvvm/ui/main/service/ServiceFragment.java
@@ -10,7 +10,7 @@
import com.runt.open.mvvm.listener.ResPonse;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class ServiceFragment extends BaseFragment<FragmentServiceBinding, ImpViewModel> implements View.OnClickListener {
app/src/main/java/com/runt/open/mvvm/util/HandleDate.java
@@ -6,7 +6,7 @@
import java.util.Date;
/**
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27.
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17.
 */
public class HandleDate {
app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java
@@ -102,36 +102,49 @@
        super.onDraw(canvas);
        Log.e("TitleBarView","onDraw mRect:"+mRect);
        if(leftDra != null){
            final Bitmap bitmap = drawableToBitmap(leftDra);
            float top = mRect.top+(viewHeight-bitmap.getHeight()*2f)/2;
            float left = mRect.left-bitmap.getWidth()*0.5f;
            leftClickRect = new RectF(left,top,left + (bitmap.getWidth()*2f),top + bitmap.getHeight()*2f);
            canvas.drawBitmap(bitmap,mRect.left,mRect.top+(viewHeight-bitmap.getHeight())/2,null);
            //点击的区域
            leftClickRect = drawBitmap(leftDra,canvas,getPaddingLeft());
        }
        if(rightDra != null){
            final Bitmap bitmap = drawableToBitmap(rightDra);
            float chaTop = (viewHeight-bitmap.getHeight())/2;
            float top = mRect.top+chaTop;
            float left = mRect.right-bitmap.getWidth();
            rightClickRect = new RectF(left-bitmap.getWidth()/2,top-bitmap.getHeight()/2,left+bitmap.getWidth()*2f,top+bitmap.getHeight()*1.5f);
            canvas.drawBitmap(bitmap,left,top,null);
            //点击的区域
            rightClickRect = drawBitmap(rightDra,canvas,getPaddingRight()+viewWidth);
        }
        if(titleText != null){
            final int textWidth = getTextWidth(textPaint, titleText);
            final int textHeight = getTextHeight(textPaint);
            final Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
            canvas.drawText(titleText,mRect.left+((viewWidth-textWidth)/2),mRect.top+((viewHeight-textHeight)/2)+(0-fontMetrics.ascent),textPaint);
            final float[] textHeight = getTextHeight(textPaint);
            float top = (getHeight()-textHeight[0])/2-textPaint.getFontMetrics().ascent;
            canvas.drawText(titleText,mRect.left+((viewWidth-textWidth)/2),top,textPaint);
        }
        if(rightText != null){
            final int textWidth = getTextWidth(rightTextPaint, rightText);
            final int textHeight = getTextHeight(rightTextPaint);
            final Paint.FontMetrics fontMetrics = rightTextPaint.getFontMetrics();
            final float[] textHeight = getTextHeight(rightTextPaint);
            float chaleft = textWidth*0.5f;
            float chaTop = textHeight[0]*0.5f;
            float left = mRect.right-textWidth;
            float top = mRect.top+((viewHeight-textHeight)/2)+(0-fontMetrics.ascent);
            rightClickRect = new RectF(left-textWidth/2,top-textHeight,left+textWidth*2f,top+textHeight/2);
            float top = (getHeight()-textHeight[0])/2-textPaint.getFontMetrics().ascent;
            rightClickRect = new RectF(left-chaleft,top-chaTop,left +chaleft*3,top + chaTop*3);
            canvas.drawText(rightText,left,top,rightTextPaint);
        }
    }
    /**
     * 绘制图片
     * @param drawable
     * @param canvas
     * @return  点击的区域
     */
    private RectF drawBitmap(Drawable drawable,Canvas canvas,float left){
        final Bitmap bitmap = drawableToBitmap(drawable);
        if(left>viewWidth){//右侧
            left -= bitmap.getWidth();
        }
        float chaTop = bitmap.getHeight()*0.5f;
        float chaleft = bitmap.getWidth()*0.5f;
        //绘制的位置
        float top = (getHeight()-bitmap.getHeight())/2;
        canvas.drawBitmap(bitmap,left,top,null);
        return new RectF(left-chaleft,top-chaTop,left +chaleft*3,top + chaTop*3);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
@@ -244,11 +257,11 @@
    }
    //第二个参数是一个数组.传进去个长度跟字符串长度相同的float数组,方法调用后,里边塞的是每个字符的长度.
    public  int  getTextHeight(Paint paint) {
    public float[] getTextHeight(Paint paint) {
        Paint.FontMetrics fm = paint.getFontMetrics();
        float height1 = fm.descent - fm.ascent;//文字的高度
        float height2 = fm.bottom - fm.top + fm.leading;//行高
        return (int) height2;
        return new float[]{height1,height2};
    }
    private void setTint(Drawable drawable, @ColorInt int color){
app/src/main/res/layout/activity_about.xml
New file
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <com.runt.open.mvvm.widgets.TitleBarView
        android:id="@+id/title_bar"
        style="@style/titlebar"
        app:leftDrawable="@mipmap/icon_white_back"
        app:leftTint="@color/txt_normal"
        app:titleText="关于我们"
        app:titleTextColor="@color/txt_normal"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:layout_weight="1">
        <com.runt.open.mvvm.widgets.CornerImageView
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginTop="40dp"
            android:src="@mipmap/ic_launcher" />
        <TextView
            android:id="@+id/txt_app"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/default_margin_td"
            android:text="@string/app_name"/>
        <TextView
            android:id="@+id/txt_ver"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/default_margin_td"
            android:text="@string/app_name"/>
    </LinearLayout>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:text="@string/title_guanui_text_1"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:text="@string/title_guanui_text_2"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:text="@string/title_guanui_text_3"
        android:layout_marginBottom="@dimen/default_margin_lr"/>
</LinearLayout>
app/src/main/res/layout/activity_login.xml
@@ -9,7 +9,8 @@
    <com.runt.open.mvvm.widgets.TitleBarView
        android:id="@+id/title_bar"
        style="@style/titlebar"
        app:leftDrawable="@mipmap/ic_arrow_back_black_24dp"
        app:leftDrawable="@mipmap/icon_white_back"
        app:leftTint="@color/txt_normal"
        app:titleText="登录"
        tools:ignore="MissingConstraints" />
app/src/main/res/layout/activity_main.xml
@@ -10,6 +10,8 @@
    <com.runt.open.mvvm.widgets.TitleBarView
        android:id="@+id/title_bar"
        style="@style/titlebar"
        app:rightDrawable="@mipmap/icon_white_setting"
        app:rightTint="@color/black"
        tools:ignore="MissingConstraints"
        app:titleText="标题" />
app/src/main/res/layout/activity_setting.xml
@@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingConstraints"
    android:background="@color/white"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
@@ -10,7 +11,6 @@
    <com.runt.open.mvvm.widgets.TitleBarView
        android:id="@+id/title_bar"
        style="@style/titlebar"
        tools:ignore="MissingConstraints"
        app:titleText="设置"
        app:leftDrawable="@mipmap/icon_white_back"
        app:leftTint="@color/black"/>
@@ -18,30 +18,14 @@
    <TextView
        android:id="@+id/version"
        app:layout_constraintTop_toBottomOf="@id/title_bar"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:background="@drawable/bg_white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="@string/str_version"
        android:textColor="@color/txt_color"
        android:textSize="@dimen/title_size"
        android:padding="15dp" />
        style="@style/lin_txt" />
    <TextView
        android:id="@+id/about"
        app:layout_constraintTop_toBottomOf="@id/version"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:background="@drawable/bg_white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/lin_txt"
        android:drawableRight="@mipmap/arrow_right"
        android:gravity="left"
        android:text="关于我们"
        android:textColor="@color/txt_color"
        android:textSize="@dimen/title_size"
        android:padding="15dp" />
        android:text="关于我们" />
    <View
        app:layout_constraintTop_toBottomOf="@id/title_bar"
        android:layout_width="match_parent"
app/src/main/res/values/strings.xml
@@ -69,4 +69,8 @@
    <string name="str_restart">重启APP</string>
    <string name="str_success">成功</string>
    <string name="str_no_up">暂无更新</string>
    <string name="title_guanui_text_1">版权所有©</string>
    <string name="title_guanui_text_2">xxx科技有限责任公司 </string>
    <string name="title_guanui_text_3">ICP备案:冀ICP备20008xxx号-1</string>
</resources>
app/src/main/res/values/styles.xml
@@ -133,5 +133,20 @@
        <item name="android:paddingRight">30dp</item>
        <item name="android:paddingLeft">30dp</item>
        <item name="android:textColor">@color/link</item>
    </style>
    <style name="lin_txt">
        <item name="layout_constraintRight_toRightOf">parent</item>
        <item name="layout_constraintLeft_toLeftOf">parent</item>
        <item name="android:background">@drawable/bg_white</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:gravity">left</item>
        <item name="android:textColor">@color/txt_color</item>
        <item name="android:textSize">@dimen/title_size</item>
        <item name="android:paddingTop">@dimen/default_margin_td</item>
        <item name="android:paddingBottom">@dimen/default_margin_td</item>
        <item name="android:paddingLeft">@dimen/default_margin_lr</item>
        <item name="android:paddingRight">@dimen/default_margin_lr</item>
    </style>
</resources>