先看效果(不会Gif图这里看图描述吧)
用到的依赖
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.google.code.gson:gson:2.8.5'
用到的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
看引导页代码(布局代码ImageView+TextView)
package com.bawei.huidiao.activity;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.bawei.huidiao.R;
public class MainActivity extends AppCompatActivity {
private ImageView iamge;
private TextView text;
private ValueAnimator valueAnimator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iamge = findViewById(R.id.start_iv);
text = findViewById(R.id.mText);
float translationY = iamge.getTranslationY();
//;//设置位移,从0,view的宽度到0,0
ObjectAnimator translation = ObjectAnimator.ofFloat(iamge, "translationY", translationY, 200f);
ObjectAnimator translation1 = ObjectAnimator.ofFloat(text, "translationY", translationY, 300f);
//设置透明度从0-1
ObjectAnimator alpha = ObjectAnimator.ofFloat(iamge, "alpha", 0f, 1f);
ObjectAnimator alpha1 = ObjectAnimator.ofFloat(text, "alpha", -1f, 1f);
//以某点旋转360度
ObjectAnimator rotation = ObjectAnimator.ofFloat(iamge, "rotation", 0f, 3600f);
//纵向缩放比例, 数值
ObjectAnimator scaleY = ObjectAnimator.ofFloat(iamge, "scaleY", 2f, 1f);
//组合动画
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(rotation).with(alpha).with(scaleY).with(translation);
animatorSet.play(alpha1).with(translation1);
//设置时间
animatorSet.setDuration(5000);
animatorSet.start();//开始动
//点击立即跳转到登录页面
iamge.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
});
//动画执行完跳转
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
});
/* valueAnimator = ValueAnimator.ofInt(600,280);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue;
animatedValue = (int)animation.getAnimatedValue();
text.layout(animatedValue,animatedValue,animatedValue+text.getWidth(),animatedValue+text.getHeight());
}
});
valueAnimator.start();*/
}
}
看登录页代码(第三方登录具体介绍截第三方登录方法)
package com.bawei.huidiao.activity;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.bawei.huidiao.R;
import com.bawei.huidiao.bean.Bean;
import com.bawei.huidiao.mvp.psenter.LoginPresenterImpl;
import com.bawei.huidiao.mvp.view.IView;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.bean.SHARE_MEDIA;
import java.util.Map;
public class LoginActivity extends AppCompatActivity implements IView {
private Button button;
private EditText psw;
private EditText name;
private LoginPresenterImpl loginPresenter;
private Button mButton,qq;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
button = findViewById(R.id.mButton);
name = findViewById(R.id.mName);
psw = findViewById(R.id.mPass);
qq = findViewById(R.id.mQQ);
mButton = findViewById(R.id.mButton1);
//初始化P层
loginPresenter = new LoginPresenterImpl();
loginPresenter.attvhView(this);
//登录
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String names = name.getText().toString();
String psws = psw.getText().toString();
loginPresenter.requestData(names,psws);
}
});
//注册
mButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this,ZhuceActivity.class);
startActivity(intent);
}
});
//第三方登录
qq.setOnClickListener(new View.OnClickListener(){
private UMShareAPI umShareAPI;
@Override
public void onClick(View v) {
umShareAPI = UMShareAPI.get(LoginActivity.this);
umShareAPI.getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ,new UMAuthListener() {
/**
* @desc 授权开始的回调
* @param platform 平台名称
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授权成功的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
* @param data 用户资料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
Toast.makeText(LoginActivity.this, "成功了", Toast.LENGTH_LONG).show();
}
/**
* @desc 授权失败的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
* @param t 错误原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(LoginActivity.this, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授权取消的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
});
}
});
}
@Override
public void shouData(Object response) {
Bean bean= (Bean) response;
String status = bean.getStatus();
String message = bean.getMessage();
if (status.equals("0000")){
Intent intent = new Intent(LoginActivity.this,Main2Activity.class);
startActivity(intent);
}else{
Toast.makeText(this,message,Toast.LENGTH_LONG).show();
}
}
//第三方登录
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(LoginActivity.this).onActivityResult(requestCode, resultCode, data);
}
}
登录页实例化到MVP中的P层,从这看MVP,首先V层接口
package com.bawei.huidiao.mvp.view;
public interface IView {
public void shouData(Object response);
}
P层接口
package com.bawei.huidiao.mvp.psenter;
import com.bawei.huidiao.mvp.view.IView;
public interface IPresenter {
//接受v层对象
public void attvhView(IView iView);
//解绑对象
public void detachView(IView iView);
//交给M层进行数据请求的处理
public void requestData(String userName,String pwd);
}
M层接口
package com.bawei.huidiao.mvp.model;
public interface IModel {
//请求数据
public void getData(String nameS,String pwsdS,CallBack1 callBack1);
interface CallBack1{
//成功
public void onSuccess(Object data);
public void OnFail(String error);
}
}
P层代码
package com.bawei.huidiao.mvp.psenter;
import com.bawei.huidiao.mvp.model.IModel;
import com.bawei.huidiao.mvp.model.loginModelImoI;
import com.bawei.huidiao.mvp.view.IView;
import java.lang.ref.SoftReference;
public class LoginPresenterImpl implements IPresenter {
IView iView;
private loginModelImoI model;
private SoftReference<IModel> iModelSoftReference;
@Override
public void attvhView(IView iView) {
this.iView=iView;
//强引用
model = new loginModelImoI();
//软引用处理
iModelSoftReference = new SoftReference<IModel>(model);
}
@Override
public void requestData(String userName, String pwd) {
model.getData(userName, pwd, new IModel.CallBack1() {
@Override
public void onSuccess(Object data) {
iView.shouData(data);
}
@Override
public void OnFail(String error) {
}
});
}
@Override
public void detachView(IView iView) {
iModelSoftReference.clear();
}
}
M层代码
package com.bawei.huidiao.mvp.model;
import com.bawei.huidiao.bean.Bean;
import com.bawei.huidiao.mvp.http.HttpUtils;
public class loginModelImoI implements IModel{
String Base_url="http://172.17.8.100/small/user/v1/login";
@Override
public void getData(String nameS, String pwsdS, final CallBack1 callBack1) {
//Bean类自己封装
HttpUtils.doPost(Base_url, nameS, pwsdS, Bean.class, new HttpUtils.NetCallback() {
@Override
public void onSuccessful(Object obj) {
callBack1.onSuccess(obj);
}
});
}
}
登录的工具类HttpUtils
package com.bawei.huidiao.mvp.http;
import android.os.Handler;
import android.view.textclassifier.TextLinks;
import com.google.gson.Gson;
import java.io.IOException;
import java.sql.Time;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class HttpUtils {
private static Handler handler = new Handler();
public static void doPost(String url,String name,String pass,final Class clazz,final NetCallback netCallback){
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(3000, TimeUnit.MILLISECONDS)
.readTimeout(3000, TimeUnit.MILLISECONDS)
.build();
FormBody build1 = new FormBody.Builder()
.add("phone",name)
.add("pwd",pass)
.build();
Request build = new Request.Builder()
.url(url)
.post(build1)
.build();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(string, clazz);
handler.post(new Runnable() {
@Override
public void run() {
netCallback.onSuccessful(o);
}
});
}
});
}
public interface NetCallback{
void onSuccessful(Object obj);
}
}
登录页布局
<?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"
tools:context=".activity.MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:padding="20dp"
android:layout_marginTop="170dp"
android:layout_gravity="center"
android:layout_height="wrap_content">
<ImageView
android:layout_width="0dp"
android:layout_weight="2"
android:src="@mipmap/zhanghao"
android:layout_height="match_parent" />
<EditText
android:id="@+id/mName"
android:layout_width="0dp"
android:layout_weight="8"
android:hint="账号"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_gravity="center"
android:padding="20dp"
android:layout_height="wrap_content">
<ImageView
android:layout_width="0dp"
android:layout_weight="2"
android:src="@mipmap/mima"
android:layout_height="match_parent" />
<EditText
android:id="@+id/mPass"
android:layout_width="0dp"
android:hint="密码"
android:layout_weight="8"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_height="wrap_content">
<Button
android:padding="20dp"
android:id="@+id/mQQ"
android:background="@mipmap/qq"
android:layout_gravity="center"
android:layout_marginLeft="100dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/mButton1"
android:padding="20dp"
android:background="@mipmap/zhuce"
android:layout_gravity="center"
android:layout_marginLeft="160dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/mButton"
android:layout_marginTop="20dp"
android:padding="20dp"
android:background="@mipmap/dui"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
注册页布局
<?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"
tools:context=".activity.MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/zFan"
android:layout_width="wrap_content"
android:src="@mipmap/fanhui"
android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:padding="20dp"
android:layout_marginTop="100dp"
android:layout_gravity="center"
android:layout_height="wrap_content">
<ImageView
android:layout_width="0dp"
android:layout_weight="2"
android:src="@mipmap/zhanghao"
android:layout_height="match_parent" />
<EditText
android:id="@+id/zName"
android:layout_width="0dp"
android:layout_weight="8"
android:hint="先起个名字吧"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_gravity="center"
android:padding="20dp"
android:layout_height="wrap_content">
<ImageView
android:layout_width="0dp"
android:layout_weight="2"
android:src="@mipmap/mima"
android:layout_height="match_parent" />
<EditText
android:id="@+id/zPass"
android:layout_width="0dp"
android:hint="再设置个密码"
android:layout_weight="8"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/zButton"
android:layout_marginTop="20dp"
android:padding="20dp"
android:background="@mipmap/dui"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
注册页代码
package com.bawei.huidiao.activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.bawei.huidiao.R;
import com.bawei.huidiao.bean.Bean;
import com.bawei.huidiao.bean.Bean1;
import com.bawei.huidiao.mvp.psenter.LoginPresenterImpl;
import com.bawei.huidiao.mvp.view.IView;
import com.bawei.huidiao.zmvp.IPresenter.Presenter;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
public class ZhuceActivity extends AppCompatActivity implements IView {
private Button zButton;
private ImageView Fan;
private EditText edit, pass;
private String name, pwd;
private Presenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zhuce);
zButton = findViewById(R.id.zButton);
Fan = findViewById(R.id.zFan);
edit = findViewById(R.id.zName);
pass = findViewById(R.id.zPass);
//实例化p层
loginPresenter = new Presenter();
loginPresenter.attvhView((IView) ZhuceActivity.this);
//点击注册
zButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
name = edit.getText().toString();
pwd = pass.getText().toString();
if (name==null||pwd==null) {
Toast.makeText(ZhuceActivity.this, "输入内容不能为空", Toast.LENGTH_SHORT).show();
} else {
loginPresenter.requestData(name, pwd);
}
}
});
//点击取消返回上页面
Fan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ZhuceActivity.this, "嗖~返回", Toast.LENGTH_SHORT).show();
finish();
}
});
}
@Override
public void shouData(final Object response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Bean1 bean1 = (Bean1) response;
String status = bean1.getStatus();
String message = bean1.getMessage();
if (status.equals("0000")) {
Toast.makeText(ZhuceActivity.this, "注册成功", Toast.LENGTH_LONG).show();
Intent intent = new Intent(ZhuceActivity.this, LoginActivity.class);
startActivity(intent);
finish();
} else if (status.equals("1001")) {
Toast.makeText(ZhuceActivity.this, message + "(注册提示)", Toast.LENGTH_LONG).show();
}
}
});
}
}
注册页MVP中V层
package com.bawei.huidiao.mvp.view;
public interface IView {
public void shouData(Object response);
}
注册页MVP中P层接口(和上面一样,只是传值改一下)
package com.bawei.huidiao.zmvp.IPresenter;
import com.bawei.huidiao.mvp.view.IView;
public interface PresenterView {
//接受v层对象
public void attvhView(IView iView);
//解绑对象
public void detachView(IView iView);
//交给M层进行数据请求的处理
public void requestData(String phone,String pwd);
}
注册页MVP中M层接口
package com.bawei.huidiao.zmvp.model;
public interface modelView {
public void getData(String nameA,String pwsdA, Callback3 callback3);
interface Callback3{
void Success(Object data);
void Fail(String error);
}
}
注册页MVP中P层代码
package com.bawei.huidiao.zmvp.IPresenter;
import com.bawei.huidiao.mvp.view.IView;
import com.bawei.huidiao.zmvp.model.model1;
import com.bawei.huidiao.zmvp.model.modelView;
import java.lang.ref.SoftReference;
public class Presenter implements PresenterView {
private modelView model2;
private SoftReference<modelView> modelViewSoftReference;
IView iView;
@Override
public void attvhView(IView iView) {
this.iView=iView;
model2 = new model1();
modelViewSoftReference = new SoftReference<modelView>(model2);
}
@Override
public void requestData(String phone, String pwd) {
model2.getData(phone, pwd, new modelView.Callback3() {
@Override
public void Success(Object data) {
iView.shouData(data);
}
@Override
public void Fail(String error) {
}
});
}
@Override
public void detachView(IView iView) {
modelViewSoftReference.clear();
}
}
注册页MVP中M层代码
package com.bawei.huidiao.zmvp.model;
import com.bawei.huidiao.bean.Bean1;
import com.bawei.huidiao.mvp.http.HttpUtils;
public class model1 implements modelView {
String Base_ur = "http://172.17.8.100/small/user/v1/register";
@Override
public void getData(String nameA, String pwsdA, final Callback3 callback3) {
HttpUtils.doPost(Base_ur,nameA,pwsdA,Bean1.class, new HttpUtils.NetCallback() {
@Override
public void onSuccessful(Object obj) {
callback3.Success(obj);
}
});
}
}