소스 검색

增加约课页面弹窗说明

Pq 3 달 전
부모
커밋
0802802f3f

+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_2dc7aa_8dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_2dc7aa" />
+    <corners android:radius="8dp" />
+</shape>

+ 1 - 0
BaseLibrary/src/main/res/values/colors.xml

@@ -226,4 +226,5 @@
     <color name="color_ff6827">#FF6827</color>
     <color name="color_18b99a">#18B99A</color>
     <color name="color_80000000">#80000000</color>
+    <color name="color_dfdfdf">#DFDFDF</color>
 </resources>

+ 25 - 0
student/src/main/java/com/cooleshow/student/bean/CourseTipBean.java

@@ -0,0 +1,25 @@
+package com.cooleshow.student.bean;
+
+/**
+ * Author by pq, Date on 2024/11/20.
+ */
+public  class CourseTipBean {
+    private String title;
+    private String des;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+    public void setDes(String des) {
+        this.des = des;
+    }
+}

+ 26 - 1
student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java

@@ -20,6 +20,7 @@ import com.cooleshow.student.contract.MineCourseContract;
 import com.cooleshow.student.databinding.ActivityAppointmentCourseBinding;
 import com.cooleshow.student.databinding.ActivityMineCourseBinding;
 import com.cooleshow.student.presenter.course.MineCoursePresenter;
+import com.cooleshow.student.widgets.dialog.CourseTipDialog;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
 
@@ -40,7 +41,7 @@ import androidx.viewpager2.widget.ViewPager2;
  * 类说明:
  */
 @Route(path = RouterPath.CourseCenter.APPOINTMENT_COURSE)
-public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointmentCourseBinding, MineCoursePresenter> implements MineCourseContract.MineCourseView {
+public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointmentCourseBinding, MineCoursePresenter> implements MineCourseContract.MineCourseView, View.OnClickListener {
     public static final String SELECT_POSITION = "selectPosition";
     private TabLayout tabLayout;
     private ViewPager2 viewPager;
@@ -50,6 +51,7 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
     private InterestCorrectionCourseListFragment mInterestCorrectionCourseListFragment;
     private LiveCourseAppointListFragment mLiveCourseAppointListFragment;
     private VideoCourseAppointListFragment mVideoCourseAppointListFragment;
+    private CourseTipDialog mCourseTipDialog;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -61,6 +63,9 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
     protected void initView() {
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "约课");
         viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
+        viewBinding.toolbarInclude.tvRight.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRight.setImageResource(R.drawable.icon_appoint_course_tip);
+        viewBinding.toolbarInclude.tvRight.setOnClickListener(this);
         tabLayout = viewBinding.tablayout;
         viewPager = viewBinding.viewPager;
     }
@@ -185,4 +190,24 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
         tab.setCustomView(view);
         return tab;
     }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if(id == com.cooleshow.base.R.id.tv_right){
+            showTipDialog();
+            return;
+        }
+    }
+
+    private void showTipDialog() {
+        int currentPos = viewBinding.viewPager.getCurrentItem();
+        if (mCourseTipDialog == null){
+            mCourseTipDialog = new CourseTipDialog(this);
+        }
+        if(!mCourseTipDialog.isShowing()){
+            mCourseTipDialog.show();
+        }
+        mCourseTipDialog.setSelect(currentPos);
+    }
 }

+ 126 - 0
student/src/main/java/com/cooleshow/student/widgets/dialog/CourseTipDialog.java

@@ -0,0 +1,126 @@
+package com.cooleshow.student.widgets.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.utils.JumpUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.AppHomeBean;
+import com.cooleshow.student.bean.CourseTipBean;
+import com.youth.banner.Banner;
+import com.youth.banner.adapter.BannerAdapter;
+import com.youth.banner.adapter.BannerImageAdapter;
+import com.youth.banner.config.IndicatorConfig;
+import com.youth.banner.indicator.RectangleIndicator;
+import com.youth.banner.listener.OnBannerListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2022/4/7.
+ */
+public class CourseTipDialog extends Dialog implements View.OnClickListener {
+    private ArrayList<CourseTipBean> list;
+    private int[] titles = new int[]{R.string.vip_course_tip_title, R.string.interest_course_tip_title, R.string.live_course_tip_title, R.string.video_course_tip_title};
+    private int[] desDatas = new int[]{R.string.vip_course_tip_str, R.string.interest_course_tip_str, R.string.live_course_tip_str, R.string.video_course_tip_str};
+    private Banner mBanner;
+    private ImageView mIvClose;
+    private TextView mTvConfirm;
+
+    public CourseTipDialog(@NonNull Context context) {
+        super(context, R.style.DialogStyle);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_course_tip_layout);
+        mIvClose = findViewById(R.id.iv_close);
+        mTvConfirm = findViewById(R.id.tv_confirm);
+        mBanner = findViewById(R.id.banner);
+        initData();
+        mIvClose.setOnClickListener(this);
+        mTvConfirm.setOnClickListener(this);
+
+    }
+
+    private void initData() {
+        list = new ArrayList<>();
+        for (int i = 0; i < titles.length; i++) {
+            CourseTipBean courseTipBean = new CourseTipBean();
+            courseTipBean.setTitle(getContext().getString(titles[i]));
+            courseTipBean.setDes(getContext().getString(desDatas[i]));
+            list.add(courseTipBean);
+        }
+        MyBannerAdapter myBannerAdapter = new MyBannerAdapter(list);
+        mBanner.setAdapter(myBannerAdapter, false)//添加生命周期观察者
+                .isAutoLoop(false)
+                .setIndicatorGravity(IndicatorConfig.Direction.RIGHT)
+//                .removeIndicator()
+                .setIndicator(new RectangleIndicator(getContext())); //圆形指示器 还支持条形指示器等
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.iv_close:
+            case R.id.tv_confirm:
+                dismiss();
+                break;
+        }
+    }
+
+    public void setSelect(int currentPos) {
+        int itemCount = mBanner.getItemCount();
+        if(currentPos<itemCount){
+            mBanner.setCurrentItem(currentPos,false);
+            mBanner.getIndicator().onPageChanged(itemCount,currentPos);
+        }
+    }
+
+    private class MyBannerAdapter extends BannerAdapter<CourseTipBean, ViewHolder> {
+
+        public MyBannerAdapter(List<CourseTipBean> datas) {
+            super(datas);
+        }
+
+        @Override
+        public ViewHolder onCreateHolder(ViewGroup parent, int viewType) {
+            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_dialog_course_tip_layout, parent, false);
+            return new ViewHolder(view);
+        }
+
+        @Override
+        public void onBindView(ViewHolder holder, CourseTipBean data, int position, int size) {
+            holder.mTvTitle.setText(data.getTitle());
+            holder.mTvDes.setText(data.getDes());
+        }
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+
+        private final TextView mTvTitle;
+        private final TextView mTvDes;
+
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+            mTvTitle = itemView.findViewById(R.id.tv_title);
+            mTvDes = itemView.findViewById(R.id.tv_des);
+        }
+    }
+}

BIN
student/src/main/res/drawable-xhdpi/bg_course_tip_top.png


BIN
student/src/main/res/drawable-xhdpi/icon_appoint_course_tip.png


BIN
student/src/main/res/drawable-xxhdpi/bg_course_tip_top.png


BIN
student/src/main/res/drawable-xxhdpi/icon_appoint_course_tip.png


+ 56 - 0
student/src/main/res/layout/dialog_course_tip_layout.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:paddingBottom="20dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:background="@drawable/bg_white_10dp"
+    android:layout_height="wrap_content">
+    <ImageView
+        android:id="@+id/iv_top"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        android:src="@drawable/bg_course_tip_top"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <ImageView
+        android:id="@+id/iv_close"
+        android:padding="13dp"
+        app:layout_constraintRight_toRightOf="@+id/iv_top"
+        app:layout_constraintTop_toTopOf="parent"
+        android:src="@drawable/icon_close_dialog_32_32"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <com.youth.banner.Banner
+        app:layout_constraintRight_toRightOf="@+id/iv_top"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_top"
+        app:layout_constraintTop_toBottomOf="@+id/iv_top"
+        android:id="@+id/banner"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:banner_indicator_gravity="center"
+        app:banner_indicator_height="6dp"
+        app:banner_indicator_normal_color="@color/color_dfdfdf"
+        app:banner_indicator_normal_width="6dp"
+        app:banner_indicator_selected_color="@color/color_2dc7aa"
+        app:banner_indicator_selected_width="16dp" />
+    
+    
+    <TextView
+        android:layout_marginTop="24dp"
+        android:id="@+id/tv_confirm"
+        android:layout_marginEnd="20dp"
+        android:layout_marginStart="20dp"
+        app:layout_constraintTop_toBottomOf="@+id/banner"
+        app:layout_constraintRight_toRightOf="@+id/iv_top"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_top"
+        tools:text="我知道了"
+        android:gravity="center"
+        android:textColor="@color/white"
+        android:background="@drawable/shape_2dc7aa_8dp"
+        android:layout_width="0dp"
+        android:layout_height="39dp"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 34 - 0
student/src/main/res/layout/item_dialog_course_tip_layout.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:orientation="vertical"
+    android:paddingTop="16dp"
+    android:paddingStart="20dp"
+    android:paddingEnd="20dp"
+    android:paddingBottom="22dp"
+    android:layout_height="match_parent"
+    xmlns:tools="http://schemas.android.com/tools">
+    <TextView
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:id="@+id/tv_title"
+        tools:text="什么是VIP定制课程?"
+        android:textSize="@dimen/sp_15"
+        android:textColor="@color/color_131415"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <TextView
+        android:paddingBottom="16dp"
+        android:includeFontPadding="false"
+        android:id="@+id/tv_des"
+        tools:text="@string/vip_course_tip_str"
+        android:textSize="@dimen/sp_13"
+        android:layout_marginTop="10dp"
+        android:lineSpacingMultiplier="1.2"
+        android:textColor="@color/color_777777"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>

+ 1 - 1
student/src/main/res/layout/item_video_course_appoint_layout.xml

@@ -58,7 +58,7 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="8dp"
         android:orientation="horizontal"
-        app:layout_constraintBottom_toTopOf="@+id/tv_buy_num"
+        app:layout_constraintBottom_toTopOf="@+id/tv_teacher_name"
         app:layout_constraintLeft_toLeftOf="@+id/tv_title"
         app:layout_constraintTop_toBottomOf="@+id/tv_title">
 

+ 8 - 0
student/src/main/res/values/strings.xml

@@ -42,4 +42,12 @@
     <string name="custom_service_tip">或通过以下方式联系我们:\n客服电话:%s\n邮箱:%s</string>
     <string name="icp_str">ICP备案号:鄂ICP备2021020787号-4A</string>
     <string name="app_info_record">增值电信业务经营许可证:鄂B2-20231246\n教育移动互联网应用备案:教APP备4200224号\n网络安全等级保护备案号:42010043158-24001\nCopyright@2021-2024|酷乐秀 colexiu.com 版权所有</string>
+    <string name="vip_course_tip_str">VIP定制课程采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。</string>
+    <string name="interest_course_tip_str">趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。</string>
+    <string name="live_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
+    <string name="video_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
+    <string name="vip_course_tip_title">什么是VIP定制课程?</string>
+    <string name="interest_course_tip_title">什么是趣纠课?</string>
+    <string name="live_course_tip_title">什么是直播课?</string>
+    <string name="video_course_tip_title">什么是视频课?</string>
 </resources>