4 次代碼提交 e55cf687f6 ... aebaa14ac4

作者 SHA1 備註 提交日期
  LAPTOP-K69FCNBP\crius aebaa14ac4 地图闯关入口,单词切割(手势存在问题) 2 年之前
  LAPTOP-K69FCNBP\crius 8cb2b6f2d0 Merge branch 'master' of http://116.62.119.248:10082/cheng_zq/EffectDemo into lwz_ 2 年之前
  LAPTOP-K69FCNBP\crius 2d39d36a71 Merge branch 'master' of http://116.62.119.248:10082/cheng_zq/EffectDemo into lwz_ 2 年之前
  LAPTOP-K69FCNBP\crius dfa4fdc2a7 烟花消失优化 2 年之前

+ 10 - 2
.idea/misc.xml

@@ -8,8 +8,6 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_count_down.xml" value="0.25" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_drag_select.xml" value="0.12708333333333333" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_enty_anim.xml" value="0.11979166666666667" />
-        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_gsxy_video.xml" value="0.1" />
-        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_ijkplay.xml" value="0.1390625" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_lottie.xml" value="0.1" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_main.xml" value="0.1375" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_progress.xml" value="0.22" />
@@ -25,6 +23,16 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_view.xml" value="0.25" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_web.xml" value="0.1816123188405797" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/demo_activity.xml" value="0.18020833333333333" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/left_round_bg.xml" value="0.1355" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/right_round_bg.xml" value="0.139" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_main.xml" value="0.20852641334569044" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_map_challenge.xml" value="0.21241050119331742" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_quxian.xml" value="0.8631178707224335" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_test2.xml" value="0.2600652883569097" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_word_cut.xml" value="0.42962962962962964" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/demo_activity.xml" value="0.35025641025641024" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/item_word_cut.xml" value="0.2577777777777778" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/view_linear.xml" value="0.17407407407407408" />
       </map>
     </option>
   </component>

+ 1 - 1
app/build.gradle

@@ -21,7 +21,7 @@ android {
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         ndk {
-            abiFilters "armeabi"
+            abiFilters "armeabi", 'arm64-v8a'
         }
         manifestPlaceholders = [
                 JPUSH_PKGNAME : applicationId,

+ 43 - 35
app/src/main/AndroidManifest.xml

@@ -4,9 +4,9 @@
     package="com.xunao.effectdemo">
 
     <uses-sdk tools:overrideLibrary="com.qmuiteam.qmui" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
@@ -14,24 +14,15 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-
-    <!-- 网络权限 -->
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- 网络权限 -->
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
-    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
-
-    <!-- mirror -->
+    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <!-- mirror -->
     <uses-permission android:name="android.permission.WAKE_LOCK" />
-    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-
-    <!-- 推送本地媒体权限 -->
-    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
-
-    <!-- 获取设备名称、蓝牙搜索(蓝牙搜索同时需要蓝牙权限和定位权限) -->
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 推送本地媒体权限 -->
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 获取设备名称、蓝牙搜索(蓝牙搜索同时需要蓝牙权限和定位权限) -->
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
 
-
     <application
         android:name=".App"
         android:allowBackup="true"
@@ -39,18 +30,17 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:usesCleartextTraffic="true"
-        android:theme="@style/AppTheme">
-
+        android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true">
         <activity android:name=".activity.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
-<!--                <action android:name="android.intent.action.VIEW" />-->
-<!--                <category android:name="android.intent.category.DEFAULT" />-->
-<!--                <category android:name="android.intent.category.BROWSABLE" />-->
-<!--                <data android:scheme="um.6304343088ccdf4b7e0d67bb" />-->
+                <!-- <action android:name="android.intent.action.VIEW" /> -->
+                <!-- <category android:name="android.intent.category.DEFAULT" /> -->
+                <!-- <category android:name="android.intent.category.BROWSABLE" /> -->
+                <!-- <data android:scheme="um.6304343088ccdf4b7e0d67bb" /> -->
             </intent-filter>
         </activity>
         <activity
@@ -76,13 +66,15 @@
         <activity
             android:name=".activity.CountDownActivity"
             android:screenOrientation="landscape" />
-        <activity android:name=".activity.LottieActivity"/>
-        <activity android:name=".activity.CongratulationsActivity"/>
-        <activity android:name=".activity.SoundActivity"/>
-        <activity android:name=".activity.StarsActivity"
-            android:screenOrientation="landscape"/>
+        <activity android:name=".activity.LottieActivity" />
+        <activity android:name=".activity.CongratulationsActivity" />
+        <activity android:name=".activity.SoundActivity" />
+        <activity
+            android:name=".activity.StarsActivity"
+            android:screenOrientation="landscape" />
 
-        <service android:name=".receiver.MyService"
+        <service
+            android:name=".receiver.MyService"
             android:enabled="true"
             android:exported="false"
             android:process=":pushcore">
@@ -90,15 +82,18 @@
                 <action android:name="cn.jiguang.user.service.action" />
             </intent-filter>
         </service>
+
         <receiver
             android:name=".receiver.PushMessageReceiver"
             android:enabled="true"
             android:exported="false">
             <intent-filter>
                 <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
-                <category android:name="com.xunao.effectdemo"/>
+
+                <category android:name="com.xunao.effectdemo" />
             </intent-filter>
         </receiver>
+
         <provider
             android:name="cn.jiguang.union.ads.service.JAdFileProvider"
             android:authorities="${applicationId}.JAdFileProvider"
@@ -107,25 +102,38 @@
             <meta-data
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/jpush_file_paths" />
+
             <intent-filter>
                 <action android:name="cn.jpush.android.intent.FileProvider" />
+
                 <category android:name="${applicationId}" />
             </intent-filter>
         </provider>
 
-        <activity android:name=".activity.UMengLoginActivity"/>
+        <activity android:name=".activity.UMengLoginActivity" />
         <activity
             android:name=".activity.WebActivity"
             android:screenOrientation="landscape" />
         <activity
             android:name=".activity.SequentialDragActivity"
             android:screenOrientation="landscape" />
-        <activity android:name=".yzs.YZSConfigActivity"/>
-        <activity android:name=".yzs.YZSDemoActivity"/>
-        <activity android:name=".activity.SongLyricActivity"/>
-        <activity android:name=".activity.IJKPlayerActivity"
+        <activity android:name=".yzs.YZSConfigActivity" />
+        <activity android:name=".yzs.YZSDemoActivity" />
+        <activity android:name=".activity.SongLyricActivity" />
+        <activity
+            android:name=".activity.IJKPlayerActivity"
+            android:screenOrientation="landscape" />
+        <activity
+            android:name=".activity.GSXYVideoPlayerActivity"
             android:screenOrientation="landscape" />
-        <activity android:name=".activity.GSXYVideoPlayerActivity"
+        <activity
+            android:name=".activity.WordCutActivity"
+            android:screenOrientation="landscape" />
+        <activity
+            android:name=".activity.MapChallengeActivity"
+            android:screenOrientation="landscape" />
+        <activity
+            android:name=".activity.VideoDemandActivity"
             android:screenOrientation="landscape" />
     </application>
 

+ 11 - 1
app/src/main/java/com/xunao/effectdemo/activity/MainActivity.java

@@ -25,7 +25,7 @@ public class MainActivity extends Activity {
 
 	Button btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,
 			btn9,btn10,btn11,btn12,btn13, btn14,btn15,btn16,
-			btn17,btn18,btn19;
+			btn17,btn18,btn19,btn20,btn21;
 	Intent intent;
 
 	@Override
@@ -141,5 +141,15 @@ public class MainActivity extends Activity {
 			intent = new Intent(MainActivity.this, GSXYVideoPlayerActivity.class);
 			startActivity(intent);
 		});
+		btn20 = findViewById(R.id.btn_20);
+		btn20.setOnClickListener(v->{
+			intent = new Intent(MainActivity.this, WordCutActivity.class);
+			startActivity(intent);
+		});
+		btn21 = findViewById(R.id.btn_21);
+		btn21.setOnClickListener(v->{
+			intent = new Intent(MainActivity.this, MapChallengeActivity.class);
+			startActivity(intent);
+		});
 	}
 }

+ 44 - 0
app/src/main/java/com/xunao/effectdemo/activity/MapChallengeActivity.java

@@ -0,0 +1,44 @@
+package com.xunao.effectdemo.activity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import com.xunao.effectdemo.R;
+
+/**
+ * 地图闯关
+ */
+public class MapChallengeActivity extends Activity {
+    Button btnMap1, btnMap2, btnMap3, btnMap4, btnMap5, btnMap6;
+
+    Intent intent;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_map_challenge);
+        initView();
+    }
+
+    void initView(){
+        btnMap1 = findViewById(R.id.btn_map_1);
+        btnMap2 = findViewById(R.id.btn_map_2);
+        btnMap3 = findViewById(R.id.btn_map_3);
+        btnMap3.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                intent = new Intent(MapChallengeActivity.this, VideoDemandActivity.class);
+                startActivity(intent);
+            }
+        });
+        btnMap4 = findViewById(R.id.btn_map_4);
+        btnMap5 = findViewById(R.id.btn_map_5);
+        btnMap6 = findViewById(R.id.btn_map_6);
+    }
+
+}

+ 20 - 0
app/src/main/java/com/xunao/effectdemo/activity/VideoDemandActivity.java

@@ -0,0 +1,20 @@
+package com.xunao.effectdemo.activity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.xunao.effectdemo.R;
+
+/**
+ * 视频点播
+ */
+public class VideoDemandActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_video_demand);
+    }
+}

+ 86 - 0
app/src/main/java/com/xunao/effectdemo/activity/WordCutActivity.java

@@ -0,0 +1,86 @@
+package com.xunao.effectdemo.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.xunao.effectdemo.R;
+import com.xunao.effectdemo.adapter.WordCutAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class WordCutActivity extends Activity {
+    private final String TAG = "WordCutActivity";
+
+    private List<String> wordList = new ArrayList<>();
+    private LinearLayout llWordCut;
+    private RecyclerView rvWordCut;
+    private WordCutAdapter wordCutAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_word_cut);
+        llWordCut = findViewById(R.id.ll_word_cut);
+        llWordCut.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                switch (event.getAction()){
+                    case MotionEvent.ACTION_MOVE:
+                        Log.i(TAG, "X:" + event.getX() + ",Y:" + event.getY());
+                        break;
+                }
+                return true;
+            }
+        });
+        rvWordCut = findViewById(R.id.rv_word_cut);
+
+        wordList.add("b");
+        wordList.add("u");
+        wordList.add("r");
+        wordList.add("g");
+        wordList.add("b");
+        wordList.add("u");
+        wordList.add("r");
+        wordList.add("g");
+        wordList.add("e");
+        wordList.add("r");
+        wordList.add("e");
+        wordList.add("r");
+        wordList.add("b");
+
+        // 设置横向布局
+        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false){
+            @Override
+            public boolean canScrollHorizontally() {
+                return false;
+            }
+        };
+        rvWordCut.setLayoutManager(linearLayoutManager);
+        wordCutAdapter = new WordCutAdapter(wordList, this);
+        rvWordCut.setAdapter(wordCutAdapter);
+
+        if(wordCutAdapter.getItemCount() > 0) {
+            RecyclerView.ViewHolder holder = rvWordCut.findViewHolderForAdapterPosition(0);
+            if (holder != null && holder instanceof WordCutAdapter.ViewHolder) {
+                WordCutAdapter.ViewHolder viewHolder = (WordCutAdapter.ViewHolder) holder;
+                int[] location = new int[2];
+                viewHolder.llSlideArea.getLocationOnScreen(location);
+                Log.i(TAG, "---x:" + location[0] + ",y:" + location[1]);
+                //使用坐标
+            }else{
+                Log.i(TAG, "yichang");
+            }
+        }else{
+            Log.i(TAG, "未完成");
+        }
+    }
+}

+ 119 - 0
app/src/main/java/com/xunao/effectdemo/adapter/WordCutAdapter.java

@@ -0,0 +1,119 @@
+package com.xunao.effectdemo.adapter;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import com.xunao.effectdemo.R;
+
+import java.util.List;
+
+public class WordCutAdapter extends RecyclerView.Adapter<WordCutAdapter.ViewHolder> {
+    public static final int TYPE_HEADER = 0;
+    public static final int TYPE_FOOT = 1;
+    public static final int TYPE_BODY = 2;
+    private List<String> wordList;
+    private final Context context;
+
+    public WordCutAdapter(List<String> mList, Context context) {
+        this.wordList = mList;
+        this.context = context;
+    }
+
+    @NonNull
+    @Override
+    public WordCutAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(viewGroup.getContext())
+                .inflate(R.layout.item_word_cut,viewGroup,false);
+        ViewHolder holder = new ViewHolder(view);
+        if(i == TYPE_HEADER){
+            holder.llLeftArea.setVisibility(View.VISIBLE);
+            holder.llSlideArea.setVisibility(View.VISIBLE);
+        }else if(i == TYPE_FOOT){
+            holder.llRightArea.setVisibility(View.VISIBLE);
+        }else{
+            holder.llSlideArea.setVisibility(View.VISIBLE);
+        }
+        return holder;
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull WordCutAdapter.ViewHolder viewHolder, int i) {
+        String data = wordList.get(i);
+        viewHolder.tvWord.setText(data);
+
+        int[] location = new int[2];
+        viewHolder.llSlideArea.getLocationInWindow(location);
+        Log.i("word", i + "---x:" + location[0] + ",y:" + location[1]);
+
+        viewHolder.llItem.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                switch (event.getAction()){
+                    case MotionEvent.ACTION_MOVE:
+                        Log.i("word", "X:" + event.getRawX() + ",Y:" + event.getRawY());
+                        break;
+                    case MotionEvent.ACTION_UP:
+                        viewHolder.llDivider.setVisibility(View.VISIBLE);
+                        break;
+                }
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        if(position == 0){
+            return TYPE_HEADER;
+        }else if(position == wordList.size() -1){
+            return TYPE_FOOT;
+        }else{
+            return TYPE_BODY;
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return wordList.isEmpty() ? 0 : wordList.size();
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+
+        TextView tvWord;
+        public LinearLayout llSlideArea;
+        LinearLayout llLeftArea;
+        LinearLayout llRightArea;
+        LinearLayout llDivider;
+        LinearLayout llItem;
+
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+            tvWord = itemView.findViewById(R.id.tv_word);
+            llSlideArea = itemView.findViewById(R.id.ll_slide_area);
+            llLeftArea = itemView.findViewById(R.id.ll_left_area);
+            llRightArea = itemView.findViewById(R.id.ll_right_area);
+            llDivider = itemView.findViewById(R.id.ll_divider);
+            llItem = itemView.findViewById(R.id.ll_item);
+        }
+    }
+
+    //1.定义变量接收接口
+    private OnItemClickListener mOnItemClickListener;
+    //2.定义接口:点击事件
+    public interface OnItemClickListener {
+        void onItemClick(View view, int position);//单击
+    }
+    //3.设置接口接收的方法
+    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+        mOnItemClickListener = onItemClickListener;
+    }
+
+}

+ 23 - 27
app/src/main/java/com/xunao/effectdemo/view/FireworkView.java

@@ -6,6 +6,7 @@ import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.util.TypedValue;
 import android.view.View;
 import android.view.animation.DecelerateInterpolator;
@@ -20,9 +21,10 @@ import androidx.annotation.Nullable;
  */
 
 public class FireworkView extends View{
+    String TAG = "FireworkView";
 
     /**
-     * 圆最大半径(心形)
+     * 圆最大半径
      */
     private float mRadius;
     /**
@@ -39,7 +41,7 @@ public class FireworkView extends View{
     private static final int[] dotColors = {0xffdaa9fa, 0xfff2bf4b, 0xffe3bca6, 0xff329aed,
             0xffb1eb99, 0xff67c9ad, 0xffde6bac};
     /**
-     * 4.圆环减消失、心形放大、周围环绕十四圆点
+     * 4.圆环减消失、周围环绕十四圆点
      */
     private static final int RING_DOT__HEART_VIEW = 3;
     /**
@@ -71,8 +73,8 @@ public class FireworkView extends View{
 
     public FireworkView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        mRadius = dp2px(20);
-        mCycleTime = 600;
+        mRadius = dp2px(30);
+        mCycleTime = 1800;
         mCenterX = mRadius;
         mCenterY = mRadius;
         mPaint = new Paint();
@@ -94,14 +96,11 @@ public class FireworkView extends View{
         }
     }
 
-    //绘制圆点、圆环、心形
+    //绘制圆点
     private void drawDotWithRing(Canvas canvas, int radius) {
         mPaint.setAntiAlias(true);
 
-        mPaint.setStyle(Paint.Style.STROKE);
         mCurrentPercent = (1f - mCurrentPercent > 1f ? 1f : 1f - mCurrentPercent) * 1f;
-        //用于计算圆环宽度,最小0,与动画进度负相关
-//        mPaint.setStrokeWidth(2 * mRadius * mCurrentPercent);
 
         float innerR = radius - mRadius * mCurrentPercent + dotR;
         double angleB = -Math.PI / 20;
@@ -109,20 +108,18 @@ public class FireworkView extends View{
         offL += dotR / 14;
         rDotL = innerR + offL;
 
-        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+        mPaint.setStyle(Paint.Style.FILL);
         for (int i = 0; i < 14; i++) {
             mPaint.setColor(dotColors[i % 7]);
             float cx = (float) (rDotL * Math.sin(angleB));
             float cy = (float) (rDotL * Math.cos(angleB));
             if(i % 3 == 0){
-                mPaint.setStrokeWidth(dotR);
                 canvas.drawCircle(cx, cy, dotR, mPaint);
             }else if(i % 3 == 1){
-                mPaint.setStrokeWidth(dotR);
-                canvas.drawText("/", cx, cy, mPaint);
+                mPaint.setTextSize(60);
+                canvas.drawText("÷", cx, cy, mPaint);
             }else{
-                mPaint.setStrokeWidth(dotR);
-                canvas.drawRect(cx - 1, cy - 1, cx + 1, cy + 1, mPaint);
+                canvas.drawRect(cx - 20, cy - 20, cx + 20, cy + 20, mPaint);
             }
 
             angleB += 2 * Math.PI / 14;
@@ -131,14 +128,13 @@ public class FireworkView extends View{
 
     }
 
-    //绘制圆点、心形
+    //绘制圆点
     private void drawDot(Canvas canvas) {
         mPaint.setAntiAlias(true);
-        mPaint.setStyle(Paint.Style.FILL);
 
         double angleB = -Math.PI / 20;
         float dotRL;
-        if (rDotL < 2.6 * mRadius) {//限制圆点的扩散范围
+        if (rDotL < 2.6 * mRadius) {  // 限制圆点的扩散范围
             rDotL += dotR / 14;
         }
         if (!isMax && mCurrentRadius <= 1.1 * mRadius) {
@@ -151,21 +147,20 @@ public class FireworkView extends View{
 
         dotRL = (dotR * (1 - mCurrentPercent) * 4) > dotR ? dotR :
                 (dotR * (1 - mCurrentPercent) * 3);
-        mPaint.setAlpha((int) (255 * (1 - mCurrentPercent)));//圆点逐渐透明
-        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+        mPaint.setStyle(Paint.Style.FILL);
         for (int i = 0; i < 14; i++) {
             mPaint.setColor(dotColors[i % 7]);
+            // 逐渐透明,setColor自带Alpha值,所以要放在setColor之后才会生效
+            mPaint.setAlpha((int) (255 * (1 - mCurrentPercent)));
             float cx = (float) (rDotL * Math.sin(angleB));
             float cy = (float) (rDotL * Math.cos(angleB));
             if(i % 3 == 0){
-                mPaint.setStrokeWidth(dotRL);
                 canvas.drawCircle(cx, cy, dotRL, mPaint);
             }else if(i % 3 == 1){
-                mPaint.setStrokeWidth(dotRL);
-                canvas.drawText("/", cx, cy, mPaint);
+                mPaint.setTextSize(60);
+                canvas.drawText("÷", cx, cy, mPaint);
             }else{
-                mPaint.setStrokeWidth(dotRL);
-                canvas.drawRect(cx - 1, cy - 1, cx + 1, cy + 1, mPaint);
+                canvas.drawRect(cx - 20, cy - 20, cx + 20, cy + 20, mPaint);
             }
 
             angleB += 2 * Math.PI / 14;
@@ -190,7 +185,7 @@ public class FireworkView extends View{
     }
 
     /**
-     * 点赞的变化效果
+     * 烟花的变化效果
      */
     public void like() {
         if (animatorTime != null && animatorTime.isRunning()) {
@@ -199,14 +194,14 @@ public class FireworkView extends View{
         resetState();
         animatorTime = ValueAnimator.ofInt(0, 1200);
         animatorTime.setDuration(mCycleTime);
-        animatorTime.setInterpolator(new DecelerateInterpolator());//需要随时间匀速变化
+        animatorTime.setInterpolator(new DecelerateInterpolator());  // 减速变化
         animatorTime.start();
         animatorTime.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
             @Override
             public void onAnimationUpdate(ValueAnimator animation) {
                 int animatedValue = (int) animation.getAnimatedValue();
 
-                    if (animatedValue <= 480) {
+                if (animatedValue <= 480) {
                     float percent = calcPercent(1f, 480f, animatedValue);//内环半径增大直至消亡
                     mCurrentPercent = percent;
                     mCurrentRadius = (int) (2 * mRadius);//外环半径不再改变
@@ -239,6 +234,7 @@ public class FireworkView extends View{
         return (current - start) / (end - start);
     }
 
+    // 转换为dp单位
     private float dp2px(int value) {
         return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
                 getResources().getDisplayMetrics());

+ 6 - 0
app/src/main/res/drawable/left_round_bg.xml

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

+ 6 - 0
app/src/main/res/drawable/right_round_bg.xml

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

+ 12 - 0
app/src/main/res/layout/activity_main.xml

@@ -119,6 +119,18 @@
             android:text="视频播放"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
+
+        <Button
+            android:id="@+id/btn_20"
+            android:text="单词切割"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+
+        <Button
+            android:id="@+id/btn_21"
+            android:text="地图闯关"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
     </LinearLayout>
 
 </ScrollView>

+ 43 - 0
app/src/main/res/layout/activity_map_challenge.xml

@@ -0,0 +1,43 @@
+<?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:gravity="center"
+    tools:context=".activity.MapChallengeActivity"
+    android:orientation="horizontal">
+
+    <Button
+        android:id="@+id/btn_map_1"
+        android:text="视频播放"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+    <Button
+        android:id="@+id/btn_map_2"
+        android:text="点图发声"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+    <Button
+        android:id="@+id/btn_map_3"
+        android:text="视频点播"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+    <Button
+        android:id="@+id/btn_map_4"
+        android:text="选择题"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+    <Button
+        android:id="@+id/btn_map_5"
+        android:text="文字泛红"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+    <Button
+        android:id="@+id/btn_map_6"
+        android:text="角色扮演"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+</LinearLayout>

+ 9 - 0
app/src/main/res/layout/activity_video_demand.xml

@@ -0,0 +1,9 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.VideoDemandActivity">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 16 - 0
app/src/main/res/layout/activity_word_cut.xml

@@ -0,0 +1,16 @@
+<?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:id="@+id/ll_word_cut"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/textGrayColor"
+    android:gravity="center"
+    android:orientation="vertical"
+    tools:context=".activity.WordCutActivity">
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_word_cut"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+</LinearLayout>

+ 55 - 0
app/src/main/res/layout/item_word_cut.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="80dp"
+    android:id="@+id/ll_item">
+        <!-- 左侧区域 -->
+        <LinearLayout
+            android:id="@+id/ll_left_area"
+            android:layout_width="40dp"
+            android:layout_height="80dp"
+            android:background="@drawable/left_round_bg"
+            android:orientation="horizontal"
+            android:visibility="gone"/>
+        <!-- 字母 -->
+        <TextView
+            android:id="@+id/tv_word"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:background="@color/colorWhite"
+            android:textSize="40sp"
+            android:textStyle="bold"
+            android:textColor="@color/colorGrayDark"
+            android:gravity="center"/>
+        <!-- 切割区域 -->
+        <LinearLayout
+            android:id="@+id/ll_slide_area"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <LinearLayout
+                android:layout_width="2dp"
+                android:layout_height="match_parent"
+                android:background="@color/colorWhite"/>
+            <!-- 分割效果 -->
+            <LinearLayout
+                android:id="@+id/ll_divider"
+                android:layout_width="8dp"
+                android:layout_height="match_parent"
+                android:background="@color/textGrayColor"
+                android:orientation="horizontal"
+                android:visibility="gone"/>
+            <LinearLayout
+                android:layout_width="2dp"
+                android:layout_height="match_parent"
+                android:background="@color/colorWhite"/>
+        </LinearLayout>
+        <!-- 右侧区域 -->
+        <LinearLayout
+            android:id="@+id/ll_right_area"
+            android:layout_width="40dp"
+            android:layout_height="80dp"
+            android:background="@drawable/right_round_bg"
+            android:orientation="horizontal"
+            android:visibility="gone"/>
+</LinearLayout>