Commit b3a5330a by Wyh

3-25 引導頁

parent f8ac03e3
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/shape_id">
<!-- 正三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="80%"
android:pivotY="50%">
<shape android:shape="rectangle">
<solid android:color="#C8C8C8" />
</shape>
</rotate>
</item>
</layer-list>
\ No newline at end of file
package com.gingersoft.gsa.cloud.ui.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.animation.AnimationUtils;
import com.gingersoft.gsa.cloud.base.R;
import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton;
public class TriangleView extends QMUIAlphaImageButton {
private static final int TOP = 0;
private static final int BOTTOM = 1;
private static final int RIGHT = 2;
private static final int LEFT = 3;
private Paint mPaint;
private Path path;
//三角形朝向
private int direction;
private int color;
private boolean isOpen;
public TriangleView(Context context) {
this(context, null);
}
public TriangleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TriangleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TriangleView, 0, 0);
color = typedArray.getColor(R.styleable.TriangleView_trv_color, context.getResources().getColor(R.color.color_c8));
direction = typedArray.getInt(R.styleable.TriangleView_trv_direction, TOP);
typedArray.recycle();
init();
}
//初始化畫筆
private void init() {
mPaint = new Paint();
//設置抗鋸齒
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(color);
path = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
switch (direction) {
case TOP:
path.moveTo(0, getHeight());
path.lineTo(getWidth(), getHeight());
path.lineTo(getWidth() / 2, 0);
break;
case BOTTOM:
path.moveTo(0, 0);
path.lineTo(getWidth() / 2, getHeight());
path.lineTo(getWidth(), 0);
break;
case RIGHT:
path.moveTo(0, 0);
path.lineTo(0, getHeight());
path.lineTo(getWidth(), getHeight() / 2);
break;
case LEFT:
path.moveTo(0, getHeight() / 2);
path.lineTo(getWidth(), getHeight());
path.lineTo(getWidth(), 0);
break;
}
path.close();
canvas.drawPath(path, mPaint);
}
public void toggle(){
if(isOpen){
startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rotate_anticlockwise_anim));
} else {
startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rotate_clockwise_anim));
}
isOpen = !isOpen;
}
}
package com.gingersoft.gsa.cloud.ui.widget.Indicator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback;
import com.gingersoft.gsa.cloud.base.R;
/**
* 通用ViewPager指示器
*/
public class UIndicator extends View {
private static final String TAG = "UIndicator";
//指示器样式一 选中未选中都是圆点
public static final int STYLE_CIRCLR_CIRCLE = 0;
//指示器样式二 选中未选中都是方形
public static final int STYLE_RECT_RECT = 1;
//指示器样式三 选中方形,未选中圆点
public static final int STYLE_CIRCLR_RECT = 2;
//横向排列
public static final int HORIZONTAL = 0;
//纵向排列
public static final int VERTICAL = 1;
private Context mContext;
//指示器之间的间距
private int spacing;
//指示器排列方向
private int orientation = HORIZONTAL;
//选中与为选中的颜色
private ColorStateList selectedColor, normalColor;
//指示器样式,默认都是圆点
private int mStyle = STYLE_CIRCLR_CIRCLE;
//样式一 圆点半径大小
private int circleCircleRadius = 0;
//样式二 方形大小及圆角
private int rectRectItemWidth = 0, rectRectItemHeight = 0, rectRectCorner = 0;
//样式三 选中的方形大小及圆角
private int circleRectItemWidth = 0, circleRectItemHeight = 0, circleRectCorner = 0;
//样式三 未选中的圆点半径
private int circleRectRadius = 0;
//画笔
private Paint normalPaint, selectedPaint;
//指示器item的区域
private RectF mRectF;
//指示器大小
private int width, height;
//指示器item个数
private int itemCount = 0;
//当前选中的位置
private int selection = 0;
private ViewPager2 viewPager;
public UIndicator(Context context) {
this(context, null);
}
public UIndicator(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public UIndicator(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init(attrs);
intPaint();
checkItemCount();
}
/**
* 加载自定义属性
*/
private void init(AttributeSet attrs) {
// 加载自定义属性集合
TypedArray ta = mContext.obtainStyledAttributes(attrs, R.styleable.Indicator);
//- 第二个参数是默认设置颜色
selectedColor = ta.getColorStateList(R.styleable.Indicator_selected_color);
normalColor = ta.getColorStateList(R.styleable.Indicator_normal_color);
spacing = ta.getDimensionPixelSize(R.styleable.Indicator_spacing, dip2px(6));
orientation = ta.getInt(R.styleable.Indicator_orientation, HORIZONTAL);
mStyle = ta.getInt(R.styleable.Indicator_style, STYLE_CIRCLR_CIRCLE);
circleCircleRadius = ta.getDimensionPixelSize(R.styleable.Indicator_circle_circle_radius, dip2px(3));
rectRectCorner = ta.getDimensionPixelSize(R.styleable.Indicator_rect_rect_corner, 0);
rectRectItemHeight = ta.getDimensionPixelSize(R.styleable.Indicator_rect_rect_itemHeight, dip2px(3));
rectRectItemWidth = ta.getDimensionPixelSize(R.styleable.Indicator_rect_rect_itemWidth, dip2px(15));
circleRectCorner = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_corner, 0);
circleRectRadius = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_radius, dip2px(3));
circleRectItemHeight = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_itemHeight, dip2px(3));
circleRectItemWidth = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_itemWidth, dip2px(15));
// 解析后释放资源
ta.recycle();
}
private void intPaint() {
normalPaint = new Paint();
normalPaint.setStyle(Paint.Style.FILL);
normalPaint.setAntiAlias(true);
normalPaint.setColor(normalColor == null ? Color.GRAY : normalColor.getDefaultColor());
selectedPaint = new Paint();
selectedPaint.setStyle(Paint.Style.FILL);
selectedPaint.setAntiAlias(true);
selectedPaint.setColor(selectedColor == null ? Color.RED : selectedColor.getDefaultColor());
mRectF = new RectF();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
switch (mStyle) {
case STYLE_CIRCLR_CIRCLE:
if (orientation == HORIZONTAL) {
width = 2 * circleCircleRadius * itemCount + (itemCount - 1) * spacing;
height = Math.max(heightSize, 2 * circleCircleRadius);
} else {
height = 2 * circleCircleRadius * itemCount + (itemCount - 1) * spacing;
width = Math.max(widthSize, 2 * circleCircleRadius);
}
break;
case STYLE_RECT_RECT:
if (orientation == HORIZONTAL) {
width = rectRectItemWidth * itemCount + (itemCount - 1) * spacing;
height = Math.max(heightSize, rectRectItemHeight);
} else {
height = rectRectItemHeight * itemCount + (itemCount - 1) * spacing;
width = Math.max(widthSize, rectRectItemWidth);
}
break;
case STYLE_CIRCLR_RECT:
if (orientation == HORIZONTAL) {
int normalItemWidth = circleRectRadius * 2;
width = (itemCount - 1) * normalItemWidth + circleRectItemWidth + (itemCount - 1) * spacing;
int tempHeight = Math.max(circleRectItemHeight, circleRectRadius * 2);
height = Math.max(heightSize, tempHeight);
} else {
int normalItemHeight = circleRectRadius * 2;
height = (itemCount - 1) * normalItemHeight + circleRectItemHeight + (itemCount - 1) * spacing;
int tempWidth = Math.max(circleRectItemWidth, circleRectRadius * 2);
width = Math.max(widthSize, tempWidth);
}
break;
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (orientation == HORIZONTAL) {
switch (mStyle) {
case STYLE_CIRCLR_CIRCLE:
float cy = height / 2;
for (int i = 0; i < itemCount; i++) {
int cx = (i + 1) * circleCircleRadius + i * spacing;
//全部绘制圆点,画笔的区别
canvas.drawCircle(cx, cy, circleCircleRadius, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_RECT_RECT:
for (int i = 0; i < itemCount; i++) {
int left = i * rectRectItemWidth + i * spacing;
mRectF.set(left, 0, left + rectRectItemWidth, rectRectItemHeight);
//全部绘制圆角矩形,画笔的区别
canvas.drawRoundRect(mRectF, rectRectCorner, rectRectCorner, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_CIRCLR_RECT:
for (int i = 0; i < itemCount; i++) {
int left = selection * (circleRectRadius * 2 + spacing);
int top;
if (selection == i) {
//选中的绘制圆角矩形
top = (height - circleRectItemHeight) / 2;
mRectF.set(left, top, left + circleRectItemWidth, circleRectItemHeight + top);
canvas.drawRoundRect(mRectF, circleRectCorner, circleRectCorner, selectedPaint);
} else {
//未选中的绘制圆点,距离需要判断position在选中的左边或者右边,从而确定cx
top = (height - circleRectRadius * 2) / 2;
int cx = 0;
float cy1 = circleRectRadius + top;
if (selection < i) {
cx = (i - 1) * circleRectRadius * 2 + i * spacing + circleRectItemWidth + circleRectRadius;
} else {
cx = i * (circleRectRadius * 2) + i * spacing + circleRectRadius;
}
canvas.drawCircle(cx, cy1, circleRectRadius, normalPaint);
}
}
break;
}
} else {
switch (mStyle) {
case STYLE_CIRCLR_CIRCLE:
float cx = width / 2;
for (int i = 0; i < itemCount; i++) {
int cy = i * (circleCircleRadius * 2 + spacing) + circleCircleRadius;
//全部绘制圆点,画笔的区别
canvas.drawCircle(cx, cy, circleCircleRadius, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_RECT_RECT:
for (int i = 0; i < itemCount; i++) {
int top = i * rectRectItemHeight + i * spacing;
int left = (width - rectRectItemWidth) / 2;
mRectF.set(left, top, left + rectRectItemWidth, top + rectRectItemHeight);
//全部绘制圆角矩形,画笔的区别
canvas.drawRoundRect(mRectF, rectRectCorner, rectRectCorner, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_CIRCLR_RECT:
for (int i = 0; i < itemCount; i++) {
if (selection == i) {
int left = (width - circleRectItemWidth) / 2;
//选中的绘制圆角矩形
int top = selection * (circleRectRadius * 2 + spacing);
mRectF.set(left, top, left + circleRectItemWidth, top + circleRectItemHeight);
canvas.drawRoundRect(mRectF, circleRectCorner, circleRectCorner, selectedPaint);
} else {
//未选中的绘制圆点,距离需要判断position在选中的左边或者右边,从而确定cx
int cx1 = (width - 2 * circleRectRadius) / 2 + circleRectRadius;
float cy1 = 0;
if (selection < i) {
cy1 = (i - 1) * circleRectRadius * 2 + i * spacing + circleRectItemHeight + circleRectRadius;
} else {
cy1 = i * (circleRectRadius * 2) + i * spacing + circleRectRadius;
}
canvas.drawCircle(cx1, cy1, circleRectRadius, normalPaint);
}
}
break;
}
}
}
/**
* 关联ViewPager
*
* @param viewPager
*/
public void attachToViewPager(ViewPager2 viewPager) {
this.viewPager = viewPager;
RecyclerView.Adapter pagerAdapter = viewPager.getAdapter();
if (pagerAdapter != null) {
//TODO 如果项目使用了阿里开源库,UltraViewPager,想要兼容需要用以下方式获取 itemCount,否则去除这个if条件
// if (pagerAdapter instanceof UltraViewPagerAdapter) {
//从UltraViewPagerAdapter获取真实的个数
// itemCount = ((UltraViewPagerAdapter) pagerAdapter).getRealCount();
// } else {
itemCount = pagerAdapter.getItemCount();
// }
selection = viewPager.getCurrentItem() % itemCount;
checkItemCount();
}
viewPager.registerOnPageChangeCallback(new OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
selection = viewPager.getCurrentItem() % itemCount;
postInvalidate();
}
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
}
});
}
/**
* 设置选中的值,当ViewPager只有一个item不显示指示器
*/
private void checkItemCount() {
if (selection >= itemCount) {
selection = itemCount - 1;
}
setVisibility((itemCount <= 1) ? GONE : VISIBLE);
}
/**
* dp to px
*/
public int dip2px(float dpValue) {
final float scale = getContext().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fillAfter="true"
android:fromDegrees="180"
android:interpolator="@android:interpolator/decelerate_cubic"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="359" />
<!-- android:repeatCount="0"-->
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fillAfter="true"
android:fromDegrees="0"
android:interpolator="@android:interpolator/decelerate_cubic"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180" />
<!-- android:repeatCount="0"-->
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="none"
android:scrollbars="none">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/indicator_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
<LinearLayout
android:id="@+id/title_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" />
</FrameLayout>
</HorizontalScrollView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/indicator_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
<LinearLayout
android:id="@+id/title_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
</FrameLayout>
\ No newline at end of file
package com.gingersoft.gsa.cloud.user.login.mvp.bean;
import android.graphics.drawable.Drawable;
public class GuideBean {
private String title;
private String details;
private Drawable img;
public GuideBean(String title, String details, Drawable img) {
this.title = title;
this.details = details;
this.img = img;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public Drawable getImg() {
return img;
}
public void setImg(Drawable img) {
this.img = img;
}
}
package com.gingersoft.gsa.cloud.user.login.mvp.ui.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.user.login.R;
import com.gingersoft.gsa.cloud.user.login.mvp.bean.GuideBean;
import java.util.List;
import static com.jess.arms.utils.DeviceUtils.getScreenWidth;
public class GuideAdapter extends RecyclerView.Adapter<GuideAdapter.BaseViewHolder> {
private List<GuideBean> guideBeanList;
private Context mContext;
public GuideAdapter(Context mContext, List<GuideBean> guideBeanList) {
this.guideBeanList = guideBeanList;
this.mContext = mContext;
}
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new BaseViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_guide, parent, false));
}
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
GuideBean item = guideBeanList.get(position);
holder.title.setText(item.getTitle());
holder.details.setText(item.getDetails());
ViewGroup.LayoutParams params = holder.img.getLayoutParams();
if (position == 0) {
params.width = (int) (getScreenWidth(mContext) * 0.75);
params.height = (int) (params.width * 1.04);
} else if (position == 1) {
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = (int) (params.width * 1.04);
} else if (position == 2) {
params.width = (int) (getScreenWidth(mContext) * 0.8);
params.height = (int) (params.width * 1.1);
}
holder.img.setLayoutParams(params);
holder.img.setImageDrawable(item.getImg());
}
@Override
public int getItemCount() {
return guideBeanList == null ? 0 : guideBeanList.size();
}
public class BaseViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private TextView details;
private ImageView img;
public BaseViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.tv_title);
details = itemView.findViewById(R.id.tv_details);
img = itemView.findViewById(R.id.iv_guide_img);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:fillAfter="true"
android:fillBefore="true"
android:fromAlpha="1"
android:toAlpha="0" />
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:fillAfter="true"
android:fillBefore="true"
android:fromAlpha="0"
android:toAlpha="1" />
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_18"
android:text="多终端云同步,轻松管理所有"
android:textColor="@color/white"
android:textSize="@dimen/dp_19"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/tv_details"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.12"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/tv_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_14"
android:text="為您搭建優良高效管理平台"
android:textColor="@color/white"
android:textSize="@dimen/dp_13"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@id/tv_title"
app:layout_constraintTop_toBottomOf="@id/tv_title" />
<ImageView
android:id="@+id/iv_guide_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -158,7 +158,7 @@
android:layout_width="@dimen/dp_30"
android:layout_height="@dimen/dp_30"
android:padding="@dimen/dp_5"
android:src="@mipmap/ic_clear_text"
android:src="@drawable/ic_clear_text"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/ed_login_user_pwd"
app:layout_constraintRight_toRightOf="parent"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment