UserManager
登录功能 流程图
引入依赖库
登录布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_dark">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="300dp">
<com.imooc.lib_commin_ui.SpreadView
android:id="@+id/spreadView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:spread_delay_milliseconds="150"
app:spread_distance="5"
app:spread_max_radius="90"
app:spread_radius="100" />
<com.imooc.lib_commin_ui.circle_image_view.CircleImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
<TextView
android:id="@+id/login_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="40dp"
android:layout_marginEnd="50dp"
android:layout_marginBottom="110dp"
android:background="@drawable/bg_mobile_loggin"
android:gravity="center"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="手机号登陆"
android:textColor="@android:color/holo_red_light"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"
android:gravity="center"
android:text="已同意《用户协议》和《隐私政策》"
android:textColor="@android:color/white"
android:textSize="10sp" />
</RelativeLayout>
点击登录时,通过UserManager.getInstance().hasLogined()来判断当前用户是否登录,如果已经登录了,则退出左滑的页面,如果没有登录,就打开登录页面
case R.id.unloggin_layout:
if (!UserManager.getInstance().hasLogined()) {
LoginActivity.start(this);
} else {
mDrawerLayout.closeDrawer(Gravity.LEFT);
}
break;
在LoginActivity里初始化P层:
//初始化P层
mUserLoginPresenter = new UserLoginPresenter(this);
findViewById(R.id.login_view).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUserLoginPresenter.login(getUserName(), getPassword());
}
});
登陆页面对应Presenter
public class UserLoginPresenter implements IUserLoginPresenter, DisposeDataListener {
private IUserLoginView mIView;
public UserLoginPresenter(IUserLoginView iView) {
mIView = iView;
}
@Override
public void login(String username, String password) {
mIView.showLoadingView();
RequestCenter.login( this);
}
@Override
public void onSuccess(Object responseObj) {
mIView.hideLoadingView();
User user = (User) responseObj;
UserManager.getInstance().setUser(user);
//发送登陆Event
EventBus.getDefault().post(new LoginEvent());//空的事件
mIView.finishActivity();
}
@Override
public void onFailure(Object reasonObj) {
mIView.hideLoadingView();
onSuccess(new Gson().fromJson(MockData.LOGIN_DATA, User.class));
mIView.showLoginFailedView();
}
}
在HomeActivity中处理登录事件:
/**
* 处理登陆事件
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLoginEvent(LoginEvent event) {
unLogginLayout.setVisibility(View.GONE);
mPhotoView.setVisibility(View.VISIBLE);
ImageLoaderManager.getInstance()
.displayImageForCircle(mPhotoView, UserManager.getInstance().getUser().data.photoUrl);
}
自定义view实现水波纹效果
在lib_common_ui下实现:
自定义属性:
<declare-styleable name="SpreadView">
<!--中心圆颜色-->
<attr name="spread_center_color" format="color" />
<!--中心圆半径-->
<attr name="spread_radius" format="integer" />
<!--扩散圆颜色-->
<attr name="spread_spread_color" format="color" />
<!--扩散间距-->
<attr name="spread_distance" format="integer" />
<!--扩散最大半径-->
<attr name="spread_max_radius" format="integer" />
<!--扩散延迟间隔-->
<attr name="spread_delay_milliseconds" format="integer" />
</declare-styleable>
初始化SpreadView :
private Paint centerPaint; //中心圆paint
private int radius = 100; //中心圆半径
private Paint spreadPaint; //扩散圆paint
private float centerX;//圆心x
private float centerY;//圆心y
private int distance = 5; //每次圆递增间距
private int maxRadius = 80; //最大圆半径
private int delayMilliseconds = 33;//扩散延迟间隔,越大扩散越慢
private List<Integer> spreadRadius = new ArrayList<>();//扩散圆层级数,元素为扩散的距离
private List<Integer> alphas = new ArrayList<>();//对应每层圆的透明度
public SpreadView(Context context) {
this(context, null, 0);
}
public SpreadView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public SpreadView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SpreadView, defStyleAttr, 0);
radius = a.getInt(R.styleable.SpreadView_spread_radius, radius);
maxRadius = a.getInt(R.styleable.SpreadView_spread_max_radius, maxRadius);
int centerColor = a.getColor(R.styleable.SpreadView_spread_center_color,
ContextCompat.getColor(context, android.R.color.holo_red_dark));
int spreadColor = a.getColor(R.styleable.SpreadView_spread_spread_color,
ContextCompat.getColor(context, R.color.color_F71816));
distance = a.getInt(R.styleable.SpreadView_spread_distance, distance);
a.recycle();
centerPaint = new Paint();
centerPaint.setColor(centerColor);
centerPaint.setAntiAlias(true);
//最开始不透明且扩散距离为0
alphas.add(255);
spreadRadius.add(0);
spreadPaint = new Paint();
spreadPaint.setAntiAlias(true);
spreadPaint.setStyle(Paint.Style.STROKE);
spreadPaint.setAlpha(255);
spreadPaint.setColor(spreadColor);
}
绘制自定义view:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//圆心位置
centerX = w / 2;
centerY = h / 2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < spreadRadius.size(); i++) {
int alpha = alphas.get(i);
spreadPaint.setAlpha(alpha);
int width = spreadRadius.get(i);
//绘制扩散的圆
canvas.drawCircle(centerX, centerY, radius + width, spreadPaint);
//每次扩散圆半径递增,圆透明度递减
if (alpha > 0 && width < 300) {
alpha = alpha - distance > 0 ? alpha - distance : 1;
alphas.set(i, alpha);
spreadRadius.set(i, width + distance);
}
}
//当最外层扩散圆半径达到最大半径时添加新扩散圆
if (spreadRadius.get(spreadRadius.size() - 1) > maxRadius) {
spreadRadius.add(0);
alphas.add(255);
}
//超过8个扩散圆,删除最先绘制的圆,即最外层的圆
if (spreadRadius.size() >= 8) {
alphas.remove(0);
spreadRadius.remove(0);
}
//中间的圆
canvas.drawCircle(centerX, centerY, radius, centerPaint);
//延迟更新,达到扩散视觉差效果
postInvalidateDelayed(delayMilliseconds);
}