2 Commits 1507e12d3e ... f3d9089796

Author SHA1 Message Date
  LAPTOP-K69FCNBP\crius f3d9089796 Merge branch 'lwz_' of http://116.62.119.248:10082/cheng_zq/EffectDemo 2 years ago
  LAPTOP-K69FCNBP\crius 066e3e2c65 雷达图 2 years ago

+ 17 - 0
.idea/deploymentTargetDropDown.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="deploymentTargetDropDown">
+    <runningDeviceTargetSelectedWithDropDown>
+      <Target>
+        <type value="RUNNING_DEVICE_TARGET" />
+        <deviceKey>
+          <Key>
+            <type value="VIRTUAL_DEVICE_PATH" />
+            <value value="C:\Users\crius\.android\avd\Nexus_7_API_31.avd" />
+          </Key>
+        </deviceKey>
+      </Target>
+    </runningDeviceTargetSelectedWithDropDown>
+    <timeTargetWasSelectedWithDropDown value="2022-09-27T09:36:11.033541300Z" />
+  </component>
+</project>

+ 1 - 0
.idea/misc.xml

@@ -33,6 +33,7 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/fragment_video_demand.xml" value="0.12291666666666666" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/item_class.xml" value="0.17604166666666668" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/item_word_sound.xml" value="0.10190217391304347" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_main.xml" value="0.19765684051398338" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_map_challenge.xml" value="0.36886005560704355" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_role_play.xml" value="0.5324675324675324" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_video_play.xml" value="0.11399443929564411" />

+ 13 - 8
app/src/main/AndroidManifest.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    package="com.xunao.effectdemo" >
+    package="com.xunao.effectdemo">
 
     <uses-sdk tools:overrideLibrary="com.qmuiteam.qmui" />
 
@@ -31,8 +31,8 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
-        android:usesCleartextTraffic="true" >
-        <activity android:name=".activity.MainActivity" >
+        android:usesCleartextTraffic="true">
+        <activity android:name=".activity.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -77,7 +77,7 @@
             android:name=".receiver.MyService"
             android:enabled="true"
             android:exported="false"
-            android:process=":pushcore" >
+            android:process=":pushcore">
             <intent-filter>
                 <action android:name="cn.jiguang.user.service.action" />
             </intent-filter>
@@ -86,7 +86,7 @@
         <receiver
             android:name=".receiver.PushMessageReceiver"
             android:enabled="true"
-            android:exported="false" >
+            android:exported="false">
             <intent-filter>
                 <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
 
@@ -98,7 +98,7 @@
             android:name="cn.jiguang.union.ads.service.JAdFileProvider"
             android:authorities="${applicationId}.JAdFileProvider"
             android:exported="false"
-            android:grantUriPermissions="true" >
+            android:grantUriPermissions="true">
             <meta-data
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/jpush_file_paths" />
@@ -146,9 +146,14 @@
             android:screenOrientation="landscape" />
         <activity android:name=".activity.NewSongLyricActivity"
             android:screenOrientation="landscape"/>
-        <activity android:name=".activity.VideoPlayActivity"
+        <activity
+            android:name=".activity.VideoPlayActivity"
+            android:screenOrientation="landscape" />
+        <activity
+            android:name=".activity.InClassActivity"
             android:screenOrientation="landscape" />
-        <activity android:name=".activity.InClassActivity"
+        <activity
+            android:name=".activity.RadarActivity"
             android:screenOrientation="landscape" />
     </application>
 

+ 6 - 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,btn20,btn21;
+			btn17,btn18,btn19,btn20,btn21,btn22;
 	Intent intent;
 
 	@Override
@@ -151,5 +151,10 @@ public class MainActivity extends Activity {
 			intent = new Intent(MainActivity.this, MapChallengeActivity.class);
 			startActivity(intent);
 		});
+		btn22 = findViewById(R.id.btn_22);
+		btn22.setOnClickListener(v->{
+			intent = new Intent(MainActivity.this, RadarActivity.class);
+			startActivity(intent);
+		});
 	}
 }

+ 39 - 0
app/src/main/java/com/xunao/effectdemo/activity/RadarActivity.java

@@ -0,0 +1,39 @@
+package com.xunao.effectdemo.activity;
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import com.xunao.effectdemo.R;
+import com.xunao.effectdemo.bean.RadarMapData;
+import com.xunao.effectdemo.view.RadarMapView;
+
+public class RadarActivity extends Activity{
+    private RadarMapView radarMapView;
+    private RadarMapData radarMapData;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_radar);
+        radarMapData=new RadarMapData();
+        setView();
+        initData();
+    }
+    private void initData() {
+        radarMapData.setCount(5);
+        radarMapData.setMainPaintColor(getResources().getColor(R.color.gray99));
+        radarMapData.setValuePaintColor(getResources().getColor(R.color.radar_color));
+        radarMapData.setTextPaintColor(getResources().getColor(R.color.black66));
+        radarMapData.setTitles(new String[]{"阅读", "口语", "听力", "语法", "自然拼读"});
+        radarMapData.setValuse(new Double[]{100.0, 67.8, 55.4, 89.0, 36.9});
+        radarMapData.setQualifiedValue(new Double[]{60.0, 60.8, 60.4, 60.0, 60.9});
+        radarMapData.setTextSize(30);
+        radarMapView.setData(radarMapData);
+    }
+
+    private void setView() {
+        radarMapView=findViewById(R.id.radar_map);
+    }
+}

+ 92 - 0
app/src/main/java/com/xunao/effectdemo/bean/RadarMapData.java

@@ -0,0 +1,92 @@
+package com.xunao.effectdemo.bean;
+
+/**
+ * Created by Administrator on 2018/3/7 0007.
+ */
+
+public class RadarMapData {
+    private int count;//设置标题数
+    private String [] titles;//设置标题
+    private Double[] valuse;//设置数值
+    private Double[] qualifiedValue;// 设置合格分数
+    private Float maxValue;//设置最大数值
+    private int mainPaintColor;//设置蜘蛛网颜色
+    private int textPaintColor;//设置标题颜色
+    private int valuePaintColor;//设置覆盖局域颜色
+    private int textSize;//设置字体大小
+
+    public RadarMapData() {
+    }
+
+    public int getTextSize() {
+        return textSize;
+    }
+
+    public void setTextSize(int textSize) {
+        this.textSize = textSize;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public String[] getTitles() {
+        return titles;
+    }
+
+    public void setTitles(String[] titles) {
+        this.titles = titles;
+    }
+
+    public Double[] getValuse() {
+        return valuse;
+    }
+
+    public void setValuse(Double[] valuse) {
+        this.valuse = valuse;
+    }
+
+    public Float getMaxValue() {
+        return maxValue;
+    }
+
+    public void setMaxValue(Float maxValue) {
+        this.maxValue = maxValue;
+    }
+
+    public int getMainPaintColor() {
+        return mainPaintColor;
+    }
+
+    public void setMainPaintColor(int mainPaintColor) {
+        this.mainPaintColor = mainPaintColor;
+    }
+
+    public int getTextPaintColor() {
+        return textPaintColor;
+    }
+
+    public void setTextPaintColor(int textPaintColor) {
+        this.textPaintColor = textPaintColor;
+    }
+
+    public int getValuePaintColor() {
+        return valuePaintColor;
+    }
+
+    public void setValuePaintColor(int valuePaintColor) {
+        this.valuePaintColor = valuePaintColor;
+    }
+
+    public Double[] getQualifiedValue() {
+        return qualifiedValue;
+    }
+
+    public void setQualifiedValue(Double[] qualifiedValue) {
+        this.qualifiedValue = qualifiedValue;
+    }
+}

+ 237 - 0
app/src/main/java/com/xunao/effectdemo/view/RadarMapView.java

@@ -0,0 +1,237 @@
+package com.xunao.effectdemo.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.DashPathEffect;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PathEffect;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.xunao.effectdemo.R;
+import com.xunao.effectdemo.bean.RadarMapData;
+
+/**
+ * Created by Administrator on 2018/3/7 0007.
+ */
+
+public class RadarMapView extends View {
+    private RadarMapData radarMapData;
+    private float angle;//每项数值之间夹角
+    private int count=6;//数值项个数
+    private int contextX,contextY;//中心点坐标
+    private float radius=100;//网格最大半径
+    private Paint mainPaint;  //雷达区画笔
+    private Paint valuePaint; //数据区画笔
+    private Paint textPaint;  //文本画笔
+    private String[] titles={"a","b","c","d","e","f"};
+    private String[] contents={"speaking","reading","c","d","e"};
+    private Double[] values={25.0,67.8,55.4,89.0,56.9,70.0};
+    private Double[] qualifiedValues={25.0,67.8,55.4,89.0,56.9,70.0};
+    private Double[] temValuses={0.0,0.0,0.0,0.0,0.0,0.0,0.0};
+    private Double[] temQualifiedValuses={0.0,0.0,0.0,0.0,0.0,0.0,0.0};
+    private float maxValue=100;//数据最大值
+    private float mDuration=1000;//动画时长
+    private float mCount=100;//分多少次运动
+    private float mCurrent = 100;   // 当前已进行时长
+    private float mPiece = mDuration/mCount; // 每一份的时长
+    public RadarMapView(Context context) {
+        this(context,null);
+
+    }
+    public RadarMapView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);;
+        mainPaint=new Paint();
+        textPaint = new Paint();
+        valuePaint = new Paint();
+        mainPaint.setColor(Color.BLUE);
+        mainPaint.setStyle(Paint.Style.STROKE);
+        mainPaint.setAntiAlias(true);
+        textPaint.setColor(Color.BLUE);
+        textPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+        textPaint.setAntiAlias(true);
+        valuePaint.setColor(Color.BLUE);
+        valuePaint.setStyle(Paint.Style.STROKE);
+        valuePaint.setAntiAlias(true);
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        contextX=w/2;
+        contextY=h/2;
+        radius=Math.min(w,h)/4*0.8f;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        drawPolygon(canvas);//绘制正多边形
+        drawLigature(canvas);
+        drawTitle(canvas);//绘制标题
+        drawCover(canvas);//绘制覆盖区域
+
+    }
+
+    private void drawLigature(Canvas canvas) {
+        Path path=new Path();
+        for (int i=0;i<count;i++){
+            path.reset();
+            path.moveTo(contextX,contextY);//将起点移到多边形中心点
+            float x= (float) (contextX+radius*Math.cos(angle*i));
+            float y = (float) (contextY + radius * Math.sin(angle * i));
+            path.lineTo(x,y);
+            canvas.drawPath(path,mainPaint);
+        }
+    }
+
+    private void drawPolygon(Canvas canvas) {
+        Path path=new Path();
+        float r=radius/(7-1);
+        for(int i=1;i<7;i++){//绘制的层数
+            float curR=r*i;//当前层数半径
+            path.reset();//使path重置
+//            for (int j=0;j<count;j++){
+//                if(j==0){//第一次绘制,将起点移到第一个将要绘制的点,即多边形中心点移动到起点
+//                  path.moveTo(contextX+curR,contextY);
+//                }else{
+//                    //使用三角函数计算x坐标和有坐标
+//                     float x= (float) (contextX+curR*Math.cos(angle*j));
+//                     float y= (float) (contextY+curR*Math.sin(angle*j));
+//                     path.lineTo(x,y);}
+//
+//            }
+            path.addCircle(contextX,contextY,curR, Path.Direction.CCW);
+            path.close();
+//            PathEffect effect = new DashPathEffect(new float[]{5,5}, 1);
+//            mainPaint.setPathEffect(effect);
+            canvas.drawPath(path,mainPaint);
+
+        }
+    }
+
+    private void drawTitle(Canvas canvas) {
+        Paint.FontMetrics fontMetrics=textPaint.getFontMetrics();
+        float fontHeight=fontMetrics.descent-fontMetrics.ascent;//得到文字的高度
+        textPaint.setTextAlign(Paint.Align.CENTER);
+        for(int i=0;i<count;i++){
+
+            float x = (float) (contextX + (radius + fontHeight/2) * Math.cos(angle * i));
+            float y = (float) (contextY + (radius + fontHeight/2) * Math.sin(angle * i));
+            if(angle*i>=0&&angle*i<=Math.PI/2){
+                textPaint.setTextSize(28);
+                Rect rect = new Rect();
+                textPaint.getTextBounds(titles[i],0,titles[i].length(),rect);
+                textPaint.setColor(getResources().getColor(R.color.blue3COpacity20));
+                int w = rect.width();
+                int h = rect.height();
+                RectF mRect = new RectF(x+fontHeight*2-30-w/2,y+fontHeight/3-h-9,x+fontHeight*2+30+w/2,y+fontHeight/3+17);
+                canvas.drawRoundRect(mRect,36,36,textPaint);
+                //第四象限
+                textPaint.setColor(getResources().getColor(R.color.blue3C));
+                canvas.drawText(titles[i],x+fontHeight*2,y+fontHeight/3,textPaint);
+                textPaint.setTextSize(20);
+                canvas.drawText(contents[i],x+fontHeight*2,y+fontHeight*5/3,textPaint);
+
+
+            }else if(angle*i>Math.PI/2&&angle*i<=Math.PI){
+
+                //第三象限
+                float drs=textPaint.measureText(titles[i]);
+                textPaint.setTextSize(28);
+                canvas.drawText(titles[i],x-drs,y+fontHeight/3,textPaint);
+            }else if(angle*i>Math.PI&&angle*i<3*Math.PI/2){
+
+                //第二象限
+                float drs=textPaint.measureText(titles[i]);
+                textPaint.setTextSize(28);
+                canvas.drawText(titles[i],x-drs,y,textPaint);
+
+            }else if(angle*i>3*Math.PI/2&&angle*i<=2*Math.PI){
+                //第一象限
+                textPaint.setTextSize(28);
+                canvas.drawText(titles[i],x,y,textPaint);
+            }
+        }
+    }
+
+    private void drawCover(Canvas canvas) {
+        Path path=new Path();
+            for (int i = 0; i < count; i++) {
+                float percent = (float) (values[i] / maxValue);//当前数值占最大数值百分比
+                float x = (float) (contextX + radius * percent * Math.cos(angle * i));
+                float y = (float) (contextY + radius * percent * Math.sin(angle * i));
+                if (i == 0) {
+                    path.moveTo(contextX + radius * percent, contextY);//将起点移到第一个将要绘制的点
+                } else {
+                    path.lineTo(x, y);
+                }
+//                valuePaint.setStyle(Paint.Style.FILL);
+//                canvas.drawCircle(x, y, 8, valuePaint);//绘制小圆点
+
+            }
+            path.close();
+            PathEffect effect = new DashPathEffect(new float[]{1,0}, 0);
+            valuePaint.setPathEffect(effect);
+//            valuePaint.setAlpha(130);//设置画笔透明度
+            valuePaint.setStyle(Paint.Style.FILL);//填充
+            valuePaint.setColor(getResources().getColor(R.color.radar_bg_color));
+            canvas.drawPath(path, valuePaint);
+            valuePaint.setStyle(Paint.Style.STROKE);//描边
+            valuePaint.setStrokeWidth(5);
+            valuePaint.setColor(getResources().getColor(R.color.radar_color));
+            canvas.drawPath(path, valuePaint);
+
+
+            Path qPath=new Path();
+            for (int i = 0; i < count; i++) {
+                float percent = (float) (qualifiedValues[i] / maxValue);//当前数值占最大数值百分比
+                float x = (float) (contextX + radius * percent * Math.cos(angle * i));
+                float y = (float) (contextY + radius * percent * Math.sin(angle * i));
+                if (i == 0) {
+                    qPath.moveTo(contextX + radius * percent, contextY);//将起点移到第一个将要绘制的点
+                } else {
+                    qPath.lineTo(x, y);
+                }
+            }
+            qPath.close();
+            PathEffect qEffect = new DashPathEffect(new float[]{10,10}, 1);
+            valuePaint.setPathEffect(qEffect);
+            valuePaint.setStyle(Paint.Style.STROKE);//描边
+            valuePaint.setStrokeWidth(5);
+            valuePaint.setColor(getResources().getColor(R.color.orangeFE));
+            canvas.drawPath(qPath, valuePaint);
+
+//            mCurrent+=mPiece;
+//            if(mCurrent<mDuration) {
+//                for (int i=0;i<count;i++){
+//                    temValuses[i]=values[i]*mCurrent/mDuration;
+//                    temQualifiedValuses[i]=qualifiedValues[i]*mCurrent/mDuration;
+//                }
+//                postInvalidateDelayed((long) mPiece);//刷新view
+//        }
+    }
+    public  void setData(RadarMapData radarMapData) {
+        this.radarMapData = radarMapData;
+        count = radarMapData.getCount();
+        angle = (float) (Math.PI * 2 / count);
+        mainPaint.setColor(radarMapData.getMainPaintColor());
+        valuePaint.setColor(radarMapData.getValuePaintColor());
+        textPaint.setColor(radarMapData.getTextPaintColor());
+        titles=radarMapData.getTitles();
+        textPaint.setTextSize(radarMapData.getTextSize());
+        values=radarMapData.getValuse();
+        qualifiedValues= radarMapData.getQualifiedValue();
+    }
+    public void start(){
+        mCurrent=0;
+        postInvalidate();
+    }
+}

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

@@ -131,6 +131,11 @@
             android:text="地图闯关"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
+        <Button
+            android:id="@+id/btn_22"
+            android:text="雷达图"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
     </LinearLayout>
 
 </ScrollView>

+ 14 - 0
app/src/main/res/layout/activity_radar.xml

@@ -0,0 +1,14 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.RadarActivity">
+
+    <com.xunao.effectdemo.view.RadarMapView
+        android:layout_width="match_parent"
+        android:layout_height="400dp"
+        android:layout_centerInParent="true"
+        android:id="@+id/radar_map" />
+</RelativeLayout>

+ 7 - 0
app/src/main/res/values/colors.xml

@@ -10,4 +10,11 @@
     <color name="shadow_dark_color">#FF7F00</color>
     <color name="shadow_middle_color">#FF9500</color>
     <color name="shadow_tint_color">#FFAC00</color>
+    <color name="radar_color">#FF2E99E7</color>
+    <color name="radar_bg_color">#803C97FF</color>
+    <color name="black66">#FF666666</color>
+    <color name="gray99">#FF999999</color>
+    <color name="orangeFE">#FFFE801D</color>
+    <color name="blue3C">#FF3C97FF</color>
+    <color name="blue3COpacity20">#333C97FF</color>
 </resources>