diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..60508a114b63a18cb50332b0bb217c419db263ef
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,11 @@
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
\ No newline at end of file
diff --git a/app/src/main/java/com/scwang/wave/app/slice/MainAbilitySlice.java b/app/src/main/java/com/scwang/wave/app/slice/MainAbilitySlice.java
index a71810ba97bc1a23fba34627ab5a84249059af3c..57fd78ef304ff22ebdf5959dde1d5c018fc46de9 100644
--- a/app/src/main/java/com/scwang/wave/app/slice/MainAbilitySlice.java
+++ b/app/src/main/java/com/scwang/wave/app/slice/MainAbilitySlice.java
@@ -86,6 +86,8 @@ public class MainAbilitySlice extends AbilitySlice implements Slider.ValueChange
*/
private Slider sliderCloseColor;
+ private String[] stringColors=new String[]{"green","cyan","yellow","red","magenta","blue"};
+
/**
* On start *
*
@@ -127,6 +129,9 @@ public class MainAbilitySlice extends AbilitySlice implements Slider.ValueChange
sliderAlpha.setProgressValue((int) (multiWaveHeader.getColorAlpha() * 100));
sliderProgress.setProgressValue((int) (multiWaveHeader.getProgress() * 100));
sliderWave.setProgressValue(multiWaveHeader.getWaveHeight() / (getResourceManager().getDeviceCapability().screenDensity / 160));
+
+ sliderStartColor.setProgressColors(new int[]{Color.GREEN.getValue(),Color.CYAN.getValue(),Color.YELLOW.getValue(),Color.RED.getValue(),Color.MAGENTA.getValue(),Color.BLUE.getValue()});
+ sliderCloseColor.setProgressColors(new int[]{Color.GREEN.getValue(),Color.CYAN.getValue(),Color.YELLOW.getValue(),Color.RED.getValue(),Color.MAGENTA.getValue(),Color.BLUE.getValue()});
}
/**
@@ -198,6 +203,9 @@ public class MainAbilitySlice extends AbilitySlice implements Slider.ValueChange
*/
@Override
public void onProgressUpdated(Slider slider, int progress, boolean fromUser) {
+ if (!fromUser){
+ return;
+ }
slider.setProgressHintText("" + progress);
slider.setProgressHintTextColor(new Color(Color.getIntColor("#FFCC99")));
@@ -215,14 +223,12 @@ public class MainAbilitySlice extends AbilitySlice implements Slider.ValueChange
multiWaveHeader.setVelocity(1f * progress / 10);
break;
case ResourceTable.Id_slider_start_color:
- int startColor = Math.abs(new SecureRandom().nextInt());
- multiWaveHeader.setStartColor(startColor);
- slider.setProgressHintText("" + startColor);
+ multiWaveHeader.setStartColor(slider.getProgressColors()[progress]);
+ slider.setProgressHintText(stringColors[progress]);
break;
case ResourceTable.Id_slider_close_color:
- int closeColor = Math.abs(new SecureRandom().nextInt());
- multiWaveHeader.setCloseColor(closeColor);
- slider.setProgressHintText("" + closeColor);
+ multiWaveHeader.setCloseColor(slider.getProgressColors()[progress]);
+ slider.setProgressHintText(stringColors[progress]);
break;
}
}
diff --git a/app/src/main/resources/base/graphic/background_ability_main.xml b/app/src/main/resources/base/graphic/background_ability_main.xml
index 23806b21f51837924cd70e02f7c4a49f68ccd012..df5904f44cf29efde72993c45cc6152ddf674e4f 100644
--- a/app/src/main/resources/base/graphic/background_ability_main.xml
+++ b/app/src/main/resources/base/graphic/background_ability_main.xml
@@ -1,6 +1,6 @@
-
+
+
\ No newline at end of file
diff --git a/app/src/main/resources/base/layout/ability_main.xml b/app/src/main/resources/base/layout/ability_main.xml
index 03cb98bc02d5d87e0b2bec905610451194d5ca9b..d4a186c5e6002968fa8a10fc39b14e9ea57ba23f 100644
--- a/app/src/main/resources/base/layout/ability_main.xml
+++ b/app/src/main/resources/base/layout/ability_main.xml
@@ -107,9 +107,9 @@
ohos:height="match_content"
ohos:width="match_parent"
ohos:divider_lines_enabled="true"
- ohos:divider_lines_number="4"
+ ohos:divider_lines_number="3"
ohos:max="5"
- ohos:min="0"/>
+ ohos:min="1"/>
diff --git a/library/src/main/java/com/scwang/wave/MultiWaveHeader.java b/library/src/main/java/com/scwang/wave/MultiWaveHeader.java
index 33e96fe40f36245e7a348bb506b5275be9fa350c..1490ced2a38a9293832f35cbc72f223e9a7d1f07 100644
--- a/library/src/main/java/com/scwang/wave/MultiWaveHeader.java
+++ b/library/src/main/java/com/scwang/wave/MultiWaveHeader.java
@@ -5,18 +5,12 @@ import ohos.agp.animation.AnimatorValue;
import ohos.agp.components.AttrSet;
import ohos.agp.components.Component;
import ohos.agp.components.ComponentContainer;
-import ohos.agp.render.Canvas;
-import ohos.agp.render.LinearShader;
-import ohos.agp.render.Paint;
-import ohos.agp.render.Path;
-import ohos.agp.render.Shader;
+import ohos.agp.render.*;
import ohos.agp.utils.Color;
import ohos.agp.utils.Matrix;
import ohos.agp.utils.Point;
import ohos.agp.utils.RectFloat;
import ohos.app.Context;
-import ohos.eventhandler.EventHandler;
-import ohos.eventhandler.EventRunner;
import java.util.ArrayList;
import java.util.List;
@@ -149,31 +143,6 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
* The constant Rebound animator
*/
protected ValueAnimator reboundAnimator;
- /**
- * The constant Refresh runnable
- */
- Runnable refreshRunnable = new Runnable() {
- @Override
- public void run() {
- invalidate();
- }
- };
- /**
- * The constant Event handler
- */
- private EventHandler eventHandler;
- /**
- * The constant Width
- */
- private int width;
- /**
- * The constant Height
- */
- private int height;
- /**
- * The constant Animator value
- */
- private AnimatorValue animatorValue;
/**
* Multi wave header
@@ -205,7 +174,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
super(context, attrs, defStyleAttr);
mPaint.setAntiAlias(true);
- mWaveHeight = AttrUtils.getIntFromAttr(attrs, MultiWaveHeader_mwhWaveHeight, Util.dp2px(50));
+ mWaveHeight = getDimensionFromAttr(attrs, MultiWaveHeader_mwhWaveHeight, Util.dp2px(getContext(),20));
mStartColor = AttrUtils.getColorFromAttr(attrs, MultiWaveHeader_mwhStartColor, 0xFF056CD0);
mCloseColor = AttrUtils.getColorFromAttr(attrs, MultiWaveHeader_mwhCloseColor, 0xFF31AFFE);
mColorAlpha = AttrUtils.getFloatFromAttr(attrs, MultiWaveHeader_mwhColorAlpha, 0.45f);
@@ -213,16 +182,25 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
mGradientAngle = AttrUtils.getIntFromAttr(attrs, MultiWaveHeader_mwhGradientAngle, 45);
mIsRunning = AttrUtils.getBooleanFromAttr(attrs, MultiWaveHeader_mwhIsRunning, true);
mEnableFullScreen = AttrUtils.getBooleanFromAttr(attrs, MultiWaveHeader_mwhEnableFullScreen, false);
- mCornerRadius = AttrUtils.getDimensionFromAttr(attrs, MultiWaveHeader_mwhCornerRadius, Util.dp2px(25));
- mShape = ShapeType.values()[AttrUtils.getIntFromAttr(attrs, MultiWaveHeader_mwhShape, mShape.ordinal())];
+ mCornerRadius = getDimensionFromAttr(attrs, MultiWaveHeader_mwhCornerRadius, Util.dp2px(getContext(),25));
+ mShape = ShapeType.getShapeType(AttrUtils.getIntFromAttr(attrs, MultiWaveHeader_mwhShape, mShape.ordinal()));
mProgress = mCurProgress = AttrUtils.getFloatFromAttr(attrs, MultiWaveHeader_mwhProgress, 1f);
- eventHandler = new EventHandler(EventRunner.getMainEventRunner());
+
setTag(AttrUtils.getStringFromAttr(attrs, MultiWaveHeader_mwhWaves,
"70,25,1.4,1.4,-26\n100,5,1.4,1.2,15\n420,0,1.15,1,-10\n520,10,1.7,1.5,20\n220,0,1,1,-15"));
setLayoutRefreshedListener(this);
addDrawTask(this);
}
+ private int getDimensionFromAttr(AttrSet attrs, String name, int defaultValue){
+ String fromAttr=AttrUtils.getStringFromAttr(attrs,name,"");
+ if (fromAttr.contains("vp")||fromAttr.contains("fp")){
+ return (int) Math.ceil(AttrUtils.getDimensionFromAttr(attrs,name,defaultValue)/1.1);
+ }else {
+ return Util.dp2px(getContext(),AttrUtils.getIntFromAttr(attrs,name,defaultValue));
+ }
+ }
+
/**
* Set alpha component int
*
@@ -245,8 +223,6 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
*/
@Override
public void onRefreshed(Component component) {
- width = component.getWidth();
- height = component.getHeight();
if (mltWave.isEmpty()) {
updateWavePath();
updateWavePath(getWidth(), getHeight());
@@ -254,7 +230,8 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
updateShapePath();
updateWavePath(getWidth(), getHeight());
updateLinearGradient(getWidth(), getHeight());
- start();
+ mLastTime = System.currentTimeMillis();
+ invalidate();
}
/**
@@ -271,6 +248,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
canvas.save();
canvas.clipPath(mPath, Canvas.ClipOp.INTERSECT);
}
+ int height=component.getHeight();
long thisTime = System.currentTimeMillis();
for (Wave wave : mltWave) {
mMatrix.reset();
@@ -291,7 +269,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
mMatrix.setTranslate(wave.offsetX, (1 - mCurProgress) * height);
canvas.translate(-wave.offsetX, -wave.offsetY - (1 - mCurProgress) * height);
}
- mPaint.getShader().setShaderMatrix(mMatrix);
+ updateLinearGradient(getWidth(),getHeight());
canvas.drawPath(wave.path, mPaint);
canvas.restore();
}
@@ -300,6 +278,9 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
if (mPath != null) {
canvas.restore();
}
+ if (isRunning()){
+ invalidate();
+ }
}
}
@@ -321,6 +302,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
Color[] colors = new Color[]{new Color(startColor), new Color(closeColor)};
float[] floats = new float[]{0, 1};
LinearShader linearShader = new LinearShader(points, floats, colors, Shader.TileMode.CLAMP_TILEMODE);
+ linearShader.setShaderMatrix(mMatrix);
mPaint.setShader(linearShader, Paint.ShaderType.LINEAR_SHADER);
}
@@ -361,13 +343,13 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
for (String wave : waves) {
String[] args = wave.split("\\s*,\\s*");
if (args.length == 5) {
- mltWave.add(new Wave(Util.dp2px(parseFloat(args[0])), Util.dp2px(parseFloat(args[1])),
- Util.dp2px(parseFloat(args[4])), parseFloat(args[2]), parseFloat(args[3]),
+ mltWave.add(new Wave(Util.dp2px(getContext(),parseFloat(args[0])), Util.dp2px(getContext(),parseFloat(args[1])),
+ Util.dp2px(getContext(),parseFloat(args[4])), parseFloat(args[2]), parseFloat(args[3]),
mWaveHeight / 2));
}
}
} else {
- mltWave.add(new Wave(Util.dp2px(50), Util.dp2px(0), Util.dp2px(5), 1.7f, 2f, mWaveHeight / 2));
+ mltWave.add(new Wave(Util.dp2px(getContext(),50), Util.dp2px(getContext(),0), Util.dp2px(getContext(),5), 1.7f, 2f, mWaveHeight / 2));
}
}
@@ -379,7 +361,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
*/
protected void updateWavePath(int width, int height) {
for (Wave wave : mltWave) {
- wave.updateWavePath(width, height, mWaveHeight / 2, mEnableFullScreen, mCurProgress);
+ wave.updateWavePath(getContext(),width, height, mWaveHeight / 2, mEnableFullScreen, mCurProgress);
}
}
@@ -450,7 +432,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
updateLinearGradient(thisView.getWidth(), thisView.getHeight());
if (mEnableFullScreen) {
for (Wave wave : mltWave) {
- wave.updateWavePath(thisView.getWidth(), thisView.getHeight(), mCurProgress);
+ wave.updateWavePath(getContext(),thisView.getWidth(), thisView.getHeight(), mCurProgress);
}
}
if (!mIsRunning) {
@@ -488,10 +470,11 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
* @param waveHeight wave height
*/
public void setWaveHeight(int waveHeight) {
- this.mWaveHeight = Util.dp2px(waveHeight);
+ this.mWaveHeight = Util.dp2px(getContext(),waveHeight);
if (!mltWave.isEmpty()) {
Component thisView = this;
updateWavePath(thisView.getWidth(), thisView.getHeight());
+ invalidate();
}
}
@@ -511,6 +494,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
*/
public void setVelocity(float velocity) {
this.mVelocity = velocity;
+ invalidate();
}
/**
@@ -534,6 +518,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
} else {
animProgress(progress, Animator.CurveType.DECELERATE, 300);
}
+ invalidate();
}
/**
@@ -546,6 +531,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
public void setProgress(float progress, int interpolator, int duration) {
this.mProgress = progress;
animProgress(progress, Animator.CurveType.DECELERATE, duration);
+ invalidate();
}
/**
@@ -567,6 +553,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
if (!mltWave.isEmpty()) {
Component thisView = this;
updateLinearGradient(thisView.getWidth(), thisView.getHeight());
+ invalidate();
}
}
@@ -589,6 +576,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
if (!mltWave.isEmpty()) {
Component thisView = this;
updateLinearGradient(thisView.getWidth(), thisView.getHeight());
+ invalidate();
}
}
@@ -621,6 +609,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
if (!mltWave.isEmpty()) {
Component thisView = this;
updateLinearGradient(thisView.getWidth(), thisView.getHeight());
+ invalidate();
}
}
@@ -662,7 +651,7 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
public void start() {
mIsRunning = true;
mLastTime = System.currentTimeMillis();
- startViewAnim(500);
+ invalidate();
}
/**
@@ -670,39 +659,6 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
*/
public void stop() {
mIsRunning = false;
- stopAnim();
- }
-
- /**
- * Start view anim animator value
- *
- * @param time time
- * @return the animator value
- */
- private AnimatorValue startViewAnim(long time) {
- animatorValue = new AnimatorValue();
- animatorValue.setDuration(time);
- animatorValue.setCurveType(Animator.CurveType.LINEAR);
- animatorValue.setLoopedCount(Integer.MAX_VALUE);
- animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {
- @Override
- public void onUpdate(AnimatorValue animatorValue, float value) {
- invalidate();
- }
- });
- animatorValue.start();
- return animatorValue;
- }
-
- /**
- * Stop anim
- */
- public void stopAnim() {
- if (animatorValue != null) {
- animatorValue.setLoopedCount(0);
- animatorValue.cancel();
- animatorValue.end();
- }
}
/**
@@ -749,5 +705,6 @@ public class MultiWaveHeader extends ComponentContainer implements Component.Lay
public void setShape(ShapeType shape) {
this.mShape = shape;
updateShapePath();
+ invalidate();
}
}
diff --git a/library/src/main/java/com/scwang/wave/ShapeType.java b/library/src/main/java/com/scwang/wave/ShapeType.java
index 4f891e0379c6938906d2084099bbeb2b4d0abbb4..3a71bc263b15abd3d563aeb601eb8893266504f9 100644
--- a/library/src/main/java/com/scwang/wave/ShapeType.java
+++ b/library/src/main/java/com/scwang/wave/ShapeType.java
@@ -15,5 +15,18 @@ public enum ShapeType {
/**
* Oval shape type
*/
- Oval,
+ Oval;
+
+ /**
+ * getShapeType
+ *
+ * @param index index
+ * @return ShapeType
+ */
+ public static ShapeType getShapeType(int index) {
+ if (index > ShapeType.values().length) {
+ return ShapeType.values()[0];
+ }
+ return ShapeType.values()[index];
+ }
}
\ No newline at end of file
diff --git a/library/src/main/java/com/scwang/wave/Util.java b/library/src/main/java/com/scwang/wave/Util.java
index 778263897a531972bd8bbd129c349cff893a6cfc..6d16591b0f5f3dfcd95d51ac66dda9a2caa3ce68 100644
--- a/library/src/main/java/com/scwang/wave/Util.java
+++ b/library/src/main/java/com/scwang/wave/Util.java
@@ -21,10 +21,11 @@ public class Util {
/**
* dp转px
*
- * @param dpVal dp 值
+ * @param context context
+ * @param dpVal dp 值
* @return px int
*/
- public static int dp2px(float dpVal) {
- return (int) (dpVal * 3);
+ public static int dp2px(Context context, float dpVal) {
+ return (int) (context.getResourceManager().getDeviceCapability().screenDensity / 160 * dpVal);
}
}
diff --git a/library/src/main/java/com/scwang/wave/Wave.java b/library/src/main/java/com/scwang/wave/Wave.java
index 559a069e099caf05be4412a0fbe721c6fe0c4b12..8b507fb122ebfccc2e261daba3f94f4c009d314c 100644
--- a/library/src/main/java/com/scwang/wave/Wave.java
+++ b/library/src/main/java/com/scwang/wave/Wave.java
@@ -1,6 +1,7 @@
package com.scwang.wave;
import ohos.agp.render.Path;
+import ohos.app.Context;
/**
* 水波对象
@@ -69,26 +70,28 @@ class Wave {
/**
* Update wave path *
*
+ * @param context context
* @param width width
* @param height height
* @param waveHeight wave height
* @param fullScreen full screen
* @param progress progress
*/
- protected void updateWavePath(int width, int height, int waveHeight, boolean fullScreen, float progress) {
+ protected void updateWavePath(Context context,int width, int height, int waveHeight, boolean fullScreen, float progress) {
this.wave = waveHeight;
this.width = (int) (2 * scaleX * width); // 画布宽度(2倍波长)
- this.path = buildWavePath(this.width, height, fullScreen, progress);
+ this.path = buildWavePath(context,this.width, height, fullScreen, progress);
}
/**
* Update wave path *
*
+ * @param context context
* @param width width
* @param height height
* @param progress progress
*/
- protected void updateWavePath(int width, int height, float progress) {
+ protected void updateWavePath(Context context,int width, int height, float progress) {
int waveHeight = (int) (scaleY * this.wave); // 计算拉伸之后的波幅
float maxWave = height * Math.max(0, (1 - progress));
if (waveHeight > maxWave) {
@@ -97,21 +100,22 @@ class Wave {
if (curWave != waveHeight) {
this.width = (int) (2 * scaleX * width); // 画布宽度(2倍波长)
- this.path = buildWavePath(this.width, height, true, progress);
+ this.path = buildWavePath(context,this.width, height, true, progress);
}
}
/**
* Build wave path path
*
+ * @param context context
* @param width width
* @param height height
* @param fullScreen full screen
* @param progress progress
* @return the path
*/
- protected Path buildWavePath(int width, int height, boolean fullScreen, float progress) {
- int dp = Util.dp2px(1); // 一个dp在当前设备表示的像素量(水波的绘制精度设为一个dp单位)
+ protected Path buildWavePath(Context context,int width, int height, boolean fullScreen, float progress) {
+ int dp = Util.dp2px(context,1); // 一个dp在当前设备表示的像素量(水波的绘制精度设为一个dp单位)
if (dp < 1) {
dp = 1;
}