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; }