From 1dc1c1d6e69d75256a7b7d26be69f563552bcf50 Mon Sep 17 00:00:00 2001 From: chenjianpeng Date: Fri, 24 Sep 2021 15:02:28 +0800 Subject: [PATCH 1/9] =?UTF-8?q?1,=E6=B7=BB=E5=8A=A0Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- easycountdowntextureview/.gitignore | 2 + easycountdowntextureview/build.gradle | 22 ++ easycountdowntextureview/consumer-rules.pro | 1 + easycountdowntextureview/proguard-rules.pro | 1 + easycountdowntextureview/src/main/config.json | 27 ++ .../EasyCountDownTextureView.java | 282 ++++++++++++++++++ .../main/resources/base/element/string.json | 8 + .../resources/base/layout/layout_base.xml | 123 ++++++++ .../easycountdowntextureview/ExampleTest.java | 9 + entry/build.gradle | 1 + entry/src/main/config.json | 64 +++- .../demo/CompletedActivity.java | 16 + .../demo/CustomText.java | 132 ++++++++ .../demo/FunctionAbility.java | 16 + .../demo}/MainAbility.java | 41 ++- .../demo/MainJavaAbility.java | 16 + .../demo}/MyApplication.java | 2 +- .../demo/SettingActivity.java | 16 + .../demo/ShowActivity.java | 16 + .../demo/adapter/MainAdapter.java | 72 +++++ .../demo/slice/CompletedActivitySlice.java | 62 ++++ .../demo/slice/MainAbilitySlice.java | 63 ++++ .../demo/slice/SettingActivitySlice.java | 54 ++++ .../demo/slice/ShowActivitySlice.java | 23 ++ .../main/resources/base/element/string.json | 12 + .../graphic/background_ability_function.xml | 8 + .../main/resources/base/graphic/toast_bg.xml | 12 + .../layout/ability_completed_activity.xml | 68 +++++ .../base/layout/ability_function.xml | 51 ++++ .../resources/base/layout/ability_main.xml | 54 ++++ .../base/layout/ability_setting_activity.xml | 137 +++++++++ .../base/layout/ability_show_activity.xml | 60 ++++ .../resources/base/layout/layout_toast.xml | 24 ++ .../base/layout/list_item_imager.xml | 31 ++ .../main/resources/base/media/bg_fruit.png | Bin 0 -> 203614 bytes settings.gradle | 2 +- 37 files changed, 1517 insertions(+), 15 deletions(-) create mode 100644 easycountdowntextureview/.gitignore create mode 100644 easycountdowntextureview/build.gradle create mode 100644 easycountdowntextureview/consumer-rules.pro create mode 100644 easycountdowntextureview/proguard-rules.pro create mode 100644 easycountdowntextureview/src/main/config.json create mode 100644 easycountdowntextureview/src/main/java/com/camnter/easycountdowntextureview/EasyCountDownTextureView.java create mode 100644 easycountdowntextureview/src/main/resources/base/element/string.json create mode 100644 easycountdowntextureview/src/main/resources/base/layout/layout_base.xml create mode 100644 easycountdowntextureview/src/test/java/com/camnter/easycountdowntextureview/ExampleTest.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/CompletedActivity.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/CustomText.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/FunctionAbility.java rename entry/src/main/java/com/{example/countdown => camnter/easycountdowntextureview/demo}/MainAbility.java (32%) create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainJavaAbility.java rename entry/src/main/java/com/{example/countdown => camnter/easycountdowntextureview/demo}/MyApplication.java (94%) create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/SettingActivity.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/ShowActivity.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/adapter/MainAdapter.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/CompletedActivitySlice.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/MainAbilitySlice.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/SettingActivitySlice.java create mode 100644 entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/ShowActivitySlice.java create mode 100644 entry/src/main/resources/base/graphic/background_ability_function.xml create mode 100644 entry/src/main/resources/base/graphic/toast_bg.xml create mode 100644 entry/src/main/resources/base/layout/ability_completed_activity.xml create mode 100644 entry/src/main/resources/base/layout/ability_function.xml create mode 100644 entry/src/main/resources/base/layout/ability_main.xml create mode 100644 entry/src/main/resources/base/layout/ability_setting_activity.xml create mode 100644 entry/src/main/resources/base/layout/ability_show_activity.xml create mode 100644 entry/src/main/resources/base/layout/layout_toast.xml create mode 100644 entry/src/main/resources/base/layout/list_item_imager.xml create mode 100644 entry/src/main/resources/base/media/bg_fruit.png diff --git a/build.gradle b/build.gradle index bc82fb6..7f91b1c 100644 --- a/build.gradle +++ b/build.gradle @@ -19,8 +19,8 @@ buildscript { } } dependencies { - classpath 'com.huawei.ohos:hap:2.4.5.0' - classpath 'com.huawei.ohos:decctest:1.2.4.1' + classpath 'com.huawei.ohos:hap:2.4.5.5' + classpath 'com.huawei.ohos:decctest:1.2.5.1' } } diff --git a/easycountdowntextureview/.gitignore b/easycountdowntextureview/.gitignore new file mode 100644 index 0000000..7d5b7a9 --- /dev/null +++ b/easycountdowntextureview/.gitignore @@ -0,0 +1,2 @@ +/build +/node_modules diff --git a/easycountdowntextureview/build.gradle b/easycountdowntextureview/build.gradle new file mode 100644 index 0000000..8fdfc61 --- /dev/null +++ b/easycountdowntextureview/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 6 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.13' +} diff --git a/easycountdowntextureview/consumer-rules.pro b/easycountdowntextureview/consumer-rules.pro new file mode 100644 index 0000000..9dccc61 --- /dev/null +++ b/easycountdowntextureview/consumer-rules.pro @@ -0,0 +1 @@ +# Add har specific ProGuard rules for consumer here. \ No newline at end of file diff --git a/easycountdowntextureview/proguard-rules.pro b/easycountdowntextureview/proguard-rules.pro new file mode 100644 index 0000000..f7666e4 --- /dev/null +++ b/easycountdowntextureview/proguard-rules.pro @@ -0,0 +1 @@ +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/easycountdowntextureview/src/main/config.json b/easycountdowntextureview/src/main/config.json new file mode 100644 index 0000000..26eeb02 --- /dev/null +++ b/easycountdowntextureview/src/main/config.json @@ -0,0 +1,27 @@ +{ + "app": { + "bundleName": "com.gzb.ohos", + "vendor": "camnter", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.camnter.easycountdowntextureview", + "deviceType": [ + "phone", + "tablet", + "tv", + "wearable", + "car" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "easycountdowntextureview", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/easycountdowntextureview/src/main/java/com/camnter/easycountdowntextureview/EasyCountDownTextureView.java b/easycountdowntextureview/src/main/java/com/camnter/easycountdowntextureview/EasyCountDownTextureView.java new file mode 100644 index 0000000..80db12c --- /dev/null +++ b/easycountdowntextureview/src/main/java/com/camnter/easycountdowntextureview/EasyCountDownTextureView.java @@ -0,0 +1,282 @@ +package com.camnter.easycountdowntextureview; + +import ohos.agp.colors.RgbColor; +import ohos.agp.components.AttrHelper; +import ohos.agp.components.AttrSet; +import ohos.agp.components.DirectionalLayout; +import ohos.agp.components.LayoutScatter; +import ohos.agp.components.Text; +import ohos.agp.components.element.ShapeElement; +import ohos.agp.utils.Color; +import ohos.agp.utils.TextAlignment; +import ohos.app.Context; +import ohos.eventhandler.EventHandler; +import ohos.eventhandler.EventRunner; +import ohos.eventhandler.InnerEvent; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 文件描述 + * + * @since 2021-09-23 + */ +public class EasyCountDownTextureView extends DirectionalLayout { + private DirectionalLayout mContainer; + private MyEventHandler myHandler; + private Text second; + private Text minute; + private Text hour; + private Text fenge1; + private Text fenge2; + private DirectionalLayout hour_background; + private DirectionalLayout second_background; + private DirectionalLayout minute_background; + private DirectionalLayout hour_background_border; + private DirectionalLayout second_background_border; + private DirectionalLayout minute_background_border; + private int timeHour = 6; + private int timeMinute = 6; + private int timeSecond = 60; + private int ifRectRadius = 0; + private int easyCountrectSpacing = 6; + private int ifsetdivision = 0; + private Timer timer; + private String easyCountBackgroundColor; + private String easyCountTimeColor; + private String easyCountRectBorderColor; + private int easyCountRectRadius; + private int easyCountTimeSize; + private EasyCountDownListener easyCountDownListener; + + public EasyCountDownTextureView(Context context) { + this(context, null, null); + } + + public EasyCountDownTextureView(Context context, AttrSet attrSet) { + this(context, attrSet, null); + easyCountBackgroundColor = attrSet.getAttr("easyCountBackgroundColor").get().getStringValue(); + easyCountTimeColor = attrSet.getAttr("easyCountTimeColor").get().getStringValue(); + easyCountRectBorderColor = attrSet.getAttr("easyCountRectBorderColor").get().getStringValue(); + easyCountRectRadius = attrSet.getAttr("easyCountRectRadius").get().getIntegerValue(); + easyCountTimeSize = attrSet.getAttr("easyCountTimeSize").get().getIntegerValue(); + timeHour = attrSet.getAttr("easyCountHour").get().getIntegerValue(); + timeMinute = attrSet.getAttr("easyCountMinute").get().getIntegerValue(); + timeSecond = attrSet.getAttr("easyCountSecond").get().getIntegerValue(); + ifRectRadius = attrSet.getAttr("ifRectRadius").get().getIntegerValue(); + easyCountrectSpacing = attrSet.getAttr("easyCountrectSpacing").get().getIntegerValue(); + ifsetdivision = attrSet.getAttr("ifsetdivision").get().getIntegerValue();//是否设置分割颜色,默然是背景色 + initView(context, attrSet); + } + + public EasyCountDownTextureView(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + } + + private void initView(Context context, AttrSet attrSet) { + EventRunner runner = EventRunner.current(); + myHandler = new MyEventHandler(runner); + headView(context); + } + + public void headView(Context context){ + LayoutScatter scatter = LayoutScatter.getInstance(context); + mContainer = (DirectionalLayout) scatter.parse(ResourceTable.Layout_layout_base, null, false); + second = (Text) mContainer.findComponentById(ResourceTable.Id_second); + minute = (Text) mContainer.findComponentById(ResourceTable.Id_minute); + hour = (Text) mContainer.findComponentById(ResourceTable.Id_hour); + fenge1 = (Text) mContainer.findComponentById(ResourceTable.Id_fenge1); + fenge2 = (Text) mContainer.findComponentById(ResourceTable.Id_fenge2); + hour_background = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_hour_background); + second_background = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_second_background); + minute_background = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_minute_background); + hour_background_border = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_hour_background_border); + second_background_border = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_second_background_border); + minute_background_border = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_minute_background_border); + + int backgroundColor = Color.getIntColor(easyCountBackgroundColor);//背景颜色 + int borderColor = Color.getIntColor(easyCountRectBorderColor);//边框颜色 + int timeColor = Color.getIntColor(easyCountTimeColor);//字体颜色 + // 设置背景和圆角度 + ShapeElement element = new ShapeElement(); + element.setRgbColor(RgbColor.fromArgbInt(backgroundColor)); + element.setCornerRadius(easyCountRectRadius); + hour_background.setBackground(element); + second_background.setBackground(element); + minute_background.setBackground(element); + // 分割颜色 + if(ifsetdivision == 0) { + fenge1.setTextColor(new Color(backgroundColor)); + fenge2.setTextColor(new Color(backgroundColor)); + } else { + fenge1.setTextColor(new Color(timeColor)); + fenge2.setTextColor(new Color(timeColor)); + } + + + // 边角 + if(ifRectRadius == 1) { // 1有边,0无 + ShapeElement element2 = new ShapeElement(); + element2.setRgbColor(RgbColor.fromArgbInt(borderColor)); + hour_background_border.setBackground(element2); + second_background_border.setBackground(element2); + minute_background_border.setBackground(element2); + } + + //字体颜色 + second.setTextColor(new Color(timeColor)); + minute.setTextColor(new Color(timeColor)); + hour.setTextColor(new Color(timeColor)); + + // 字体大小 + second.setTextSize(AttrHelper.fp2px(easyCountTimeSize,context)); + minute.setTextSize(AttrHelper.fp2px(easyCountTimeSize,context)); + hour.setTextSize(AttrHelper.fp2px(easyCountTimeSize,context)); + fenge1.setTextSize(AttrHelper.fp2px(easyCountTimeSize,context)); + fenge2.setTextSize(AttrHelper.fp2px(easyCountTimeSize,context)); + + // padding 间距 easyCountrectSpacing + hour_background.setPaddingLeft(AttrHelper.vp2px(easyCountrectSpacing,context)); + hour_background.setPaddingRight(AttrHelper.vp2px(easyCountrectSpacing,context)); + second_background.setPaddingLeft(AttrHelper.vp2px(easyCountrectSpacing,context)); + second_background.setPaddingRight(AttrHelper.vp2px(easyCountrectSpacing,context)); + minute_background.setPaddingLeft(AttrHelper.vp2px(easyCountrectSpacing,context)); + minute_background.setPaddingRight(AttrHelper.vp2px(easyCountrectSpacing,context)); + + + addComponent(mContainer); + setAlignment(TextAlignment.VERTICAL_CENTER); + timeStart(); + } + private void timeStart(){ + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + timeSecond --; + if(timeSecond == -1){ + timeSecond = 60; + timeMinute --; + } + if(timeMinute == -1){ + timeMinute = 60; + timeHour --; + } + if(timeSecond == 0 && timeMinute == 0 && timeHour == 0){ + timer.cancel(); + } + InnerEvent normalInnerEvent = InnerEvent.get(1001, timeSecond, null); + myHandler.sendEvent(normalInnerEvent, 0, EventHandler.Priority.IMMEDIATE); + System.out.println("========111111========"+timeSecond); + } + }, 0, 1000); + } + + /** + * 更新UI的 Handler类 + * + * @author:Hexy + * @since 2021-04-14 + */ + private class MyEventHandler extends EventHandler { + private MyEventHandler(EventRunner runner) { + super(runner); + } + + // 重写实现processEvent方法 + @Override + public void processEvent(InnerEvent event) { + super.processEvent(event); + if (event == null) { + return; + } + int eventId = event.eventId; + switch (eventId) { + case 1001: + // 待执行的操作,由开发者定义 + // 秒 + if(timeSecond < 10) { + second.setText("0"+timeSecond + ""); + if(easyCountDownListener != null && timeSecond == 0){ + easyCountDownListener.onCountDownCompleted(); + } + } else { + second.setText(timeSecond + ""); + } + // 分 + if(timeMinute < 10) { + minute.setText("0"+timeMinute + ""); + } else { + minute.setText(timeMinute + ""); + } + // 时 + if(timeHour < 10) { + hour.setText("0"+timeHour + ""); + } else { + hour.setText(timeHour + ""); + } + + System.out.println("timeSecond=="+timeSecond); + break; + default: + break; + } + } + } + + public void setTimeHour(final int timeHour) { + this.timeHour = timeHour; + } + + + public void setTimeMinute(final int timeMinute) { + this.timeMinute = timeMinute; + } + + + public void setTimeSecond(final int timeSecond) { + this.timeSecond = timeSecond; + } + + public void start() { + timeStart(); + } + + + public void stop() { + if(timer != null) { + timer.cancel(); + } + } + + public void setEasyCountDownListener( EasyCountDownListener easyCountDownListener) { + this.easyCountDownListener = easyCountDownListener; + } + + public interface EasyCountDownListener { + + /** + * When count down start + */ + void onCountDownStart(); + + /** + * When count down time error + */ + void onCountDownTimeError(); + + /** + * When count down stop + * + * @param millisInFuture millisInFuture + */ + void onCountDownStop(long millisInFuture); + + /** + * When count down completed + */ + void onCountDownCompleted(); + + } +} diff --git a/easycountdowntextureview/src/main/resources/base/element/string.json b/easycountdowntextureview/src/main/resources/base/element/string.json new file mode 100644 index 0000000..be23ab2 --- /dev/null +++ b/easycountdowntextureview/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "easycountdowntextureview_library", + "value": "easycountdowntextureview_library" + } + ] +} diff --git a/easycountdowntextureview/src/main/resources/base/layout/layout_base.xml b/easycountdowntextureview/src/main/resources/base/layout/layout_base.xml new file mode 100644 index 0000000..eca5d9f --- /dev/null +++ b/easycountdowntextureview/src/main/resources/base/layout/layout_base.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/easycountdowntextureview/src/test/java/com/camnter/easycountdowntextureview/ExampleTest.java b/easycountdowntextureview/src/test/java/com/camnter/easycountdowntextureview/ExampleTest.java new file mode 100644 index 0000000..ac24f76 --- /dev/null +++ b/easycountdowntextureview/src/test/java/com/camnter/easycountdowntextureview/ExampleTest.java @@ -0,0 +1,9 @@ +package com.camnter.easycountdowntextureview; + +import org.junit.Test; + +public class ExampleTest { + @Test + public void onStart() { + } +} diff --git a/entry/build.gradle b/entry/build.gradle index 8b7ec83..87ccf4a 100644 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -21,6 +21,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) testImplementation 'junit:junit:4.13' ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.200' + implementation project(":easycountdowntextureview") } decc { supportType = ['html','xml'] diff --git a/entry/src/main/config.json b/entry/src/main/config.json index f037410..8acc6fb 100644 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -1,6 +1,6 @@ { "app": { - "bundleName": "com.gzb.ohos", + "bundleName": "com.camnter.easycountdowntextureview.demo", "vendor": "example", "version": { "code": 1000000, @@ -9,9 +9,9 @@ }, "deviceConfig": {}, "module": { - "package": "com.example.countdown", + "package": "com.camnter.easycountdowntextureview.demo", "name": ".MyApplication", - "mainAbility": "com.example.countdown.MainAbility", + "mainAbility": "com.camnter.easycountdowntextureview.demo.MainAbility", "deviceType": [ "phone", "tablet", @@ -36,12 +36,57 @@ ] } ], - "name": "com.example.countdown.MainAbility", + "name": "com.camnter.easycountdowntextureview.demo.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", "type": "page", "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "com.camnter.easycountdowntextureview.demo.FunctionAbility", + "icon": "$media:icon", + "description": "$string:functionability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "com.camnter.easycountdowntextureview.demo.MainJavaAbility", + "icon": "$media:icon", + "description": "$string:app_name", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "com.camnter.easycountdowntextureview.demo.ShowActivity", + "icon": "$media:icon", + "description": "$string:app_name", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "com.camnter.easycountdowntextureview.demo.SettingActivity", + "icon": "$media:icon", + "description": "$string:app_name", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "com.camnter.easycountdowntextureview.demo.CompletedActivity", + "icon": "$media:icon", + "description": "$string:app_name", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" } ], "js": [ @@ -58,6 +103,15 @@ "autoDesignWidth": true } } - ] + ], + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar", + "extra": "" + } + ] + } } } \ No newline at end of file diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/CompletedActivity.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/CompletedActivity.java new file mode 100644 index 0000000..3ba6139 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/CompletedActivity.java @@ -0,0 +1,16 @@ +package com.camnter.easycountdowntextureview.demo; + +import com.camnter.easycountdowntextureview.demo.slice.CompletedActivitySlice; +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.utils.Color; +import ohos.agp.window.service.WindowManager; + +public class CompletedActivity extends Ability { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(CompletedActivitySlice.class.getName()); + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.getIntColor("#2F3F9D")); // 设置状态栏颜色 + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/CustomText.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/CustomText.java new file mode 100644 index 0000000..886fc91 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/CustomText.java @@ -0,0 +1,132 @@ +package com.camnter.easycountdowntextureview.demo; + +import ohos.agp.colors.RgbColor; +import ohos.agp.components.AttrHelper; +import ohos.agp.components.AttrSet; +import ohos.agp.components.Button; +import ohos.agp.components.ComponentState; +import ohos.agp.components.element.ShapeElement; +import ohos.agp.components.element.StateElement; +import ohos.agp.utils.Color; +import ohos.app.Context; + +/** + * 圆角、边框、点击效果 + */ +public class CustomText extends Button { + private final Context mContext; + + //圆角半径 + private float cornerRadius = 0f; + //圆角半径-左上 + private float cornerRadiusLeftTop = 0f; + //圆角半径-左下 + private float cornerRadiusLeftBottom = 0f; + //圆角半径-右上 + private float cornerRadiusRightTop = 0f; + //圆角半径-右下 + private float cornerRadiusRightBottom = 0f; + + //默认背景色 + private Color bgDefaultColor = Color.TRANSPARENT; + //按压背景色 + private Color bgPressedColor = Color.TRANSPARENT; + + //边框线宽度 + private int strokeWidth = 0; + //边框线颜色 + private Color strokeColor = Color.TRANSPARENT; + + public CustomText(Context context) { + this(context, null); + } + + public CustomText(Context context, AttrSet attrSet) { + this(context, attrSet, null); + } + + public CustomText(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + mContext = context; + + if (attrSet.getAttr("cornerRadius").isPresent()) { + cornerRadius = attrSet.getAttr("cornerRadius").get().getFloatValue(); + } + if (attrSet.getAttr("cornerRadiusLeftTop").isPresent()) { + cornerRadiusLeftTop = attrSet.getAttr("cornerRadiusLeftTop").get().getFloatValue(); + } + if (attrSet.getAttr("cornerRadiusLeftBottom").isPresent()) { + cornerRadiusLeftBottom = attrSet.getAttr("cornerRadiusLeftBottom").get().getFloatValue(); + } + if (attrSet.getAttr("cornerRadiusRightTop").isPresent()) { + cornerRadiusRightTop = attrSet.getAttr("cornerRadiusRightTop").get().getFloatValue(); + } + if (attrSet.getAttr("cornerRadiusRightBottom").isPresent()) { + cornerRadiusRightBottom = attrSet.getAttr("cornerRadiusRightBottom").get().getFloatValue(); + } + if (attrSet.getAttr("bgDefaultColor").isPresent()) { + bgDefaultColor = attrSet.getAttr("bgDefaultColor").get().getColorValue(); + } + if (attrSet.getAttr("bgPressedColor").isPresent()) { + bgPressedColor = attrSet.getAttr("bgPressedColor").get().getColorValue(); + } + if (attrSet.getAttr("strokeWidth").isPresent()) { + strokeWidth = attrSet.getAttr("strokeWidth").get().getIntegerValue(); + } + if (attrSet.getAttr("strokeColor").isPresent()) { + strokeColor = attrSet.getAttr("strokeColor").get().getColorValue(); + } + + init(); + } + + private void init() { + //包含多个状态的Element + StateElement stateElement = new StateElement(); + + //默认的Element + if (bgDefaultColor.getValue() != Color.TRANSPARENT.getValue()) { + ShapeElement seDefault = getShapeElement(); + seDefault.setRgbColor(RgbColor.fromArgbInt(bgDefaultColor.getValue())); + stateElement.addState(new int[]{-ComponentState.COMPONENT_STATE_PRESSED}, seDefault); + } + + //按压状态的Element + if (bgPressedColor.getValue() != Color.TRANSPARENT.getValue()) { + ShapeElement sePressed = getShapeElement(); + sePressed.setRgbColor(RgbColor.fromArgbInt(bgPressedColor.getValue())); + stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, sePressed); + } + + //设置到背景中 + setBackground(stateElement); + } + + /** + * 获取公共的Element,一般不同状态下圆角都一样。 + */ + private ShapeElement getShapeElement() { + ShapeElement shapeElement = new ShapeElement(); + shapeElement.setShape(ShapeElement.RECTANGLE); + if (cornerRadius != 0f) { + shapeElement.setCornerRadius(vp2px(cornerRadius)); + } else { + //左上角需要xy轴 left_top_x,left_top_y,其他类似 + shapeElement.setCornerRadiiArray(new float[]{ + vp2px(cornerRadiusLeftTop), vp2px(cornerRadiusLeftTop), + vp2px(cornerRadiusRightTop), vp2px(cornerRadiusRightTop), + vp2px(cornerRadiusRightBottom), vp2px(cornerRadiusRightBottom), + vp2px(cornerRadiusLeftBottom), vp2px(cornerRadiusLeftBottom), + }); + } + if (strokeWidth != 0f) { + shapeElement.setStroke((int) vp2px(strokeWidth), RgbColor.fromArgbInt(strokeColor.getValue())); + } + return shapeElement; + } + + + private float vp2px(float value) { + return AttrHelper.vp2px(value, mContext); + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/FunctionAbility.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/FunctionAbility.java new file mode 100644 index 0000000..df57a2d --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/FunctionAbility.java @@ -0,0 +1,16 @@ +package com.camnter.easycountdowntextureview.demo; + +import ohos.aafwk.content.Intent; +import ohos.ace.ability.AceAbility; + +public class FunctionAbility extends AceAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + } + + @Override + public void onStop() { + super.onStop(); + } +} diff --git a/entry/src/main/java/com/example/countdown/MainAbility.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainAbility.java similarity index 32% rename from entry/src/main/java/com/example/countdown/MainAbility.java rename to entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainAbility.java index c166847..d1a9bc1 100644 --- a/entry/src/main/java/com/example/countdown/MainAbility.java +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainAbility.java @@ -13,24 +13,53 @@ * limitations under the License. */ -package com.example.countdown; - -import ohos.ace.ability.AceAbility; +package com.camnter.easycountdowntextureview.demo; +import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; +import ohos.aafwk.content.Operation; +import ohos.agp.components.Component; +import ohos.agp.utils.Color; +import ohos.agp.window.service.WindowManager; /** * MainAbility * * @since 2021-08-10 */ -public class MainAbility extends AceAbility { +public class MainAbility extends Ability { @Override public void onStart(Intent intent) { super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_function); + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.getIntColor("#2F3F9D")); // 设置状态栏颜色 } @Override - public void onStop() { - super.onStop(); + protected void onActive() { + super.onActive(); + findComponentById(ResourceTable.Id_btnJava).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + Intent intent = new Intent(); + Operation operation = new Intent.OperationBuilder() + .withBundleName(getBundleName()) + .withAbilityName(MainJavaAbility.class.getName()) + .build(); + intent.setOperation(operation); + startAbility(intent); + } + }); + findComponentById(ResourceTable.Id_btnJS).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + Intent intent = new Intent(); + Operation operation = new Intent.OperationBuilder() + .withBundleName(getBundleName()) + .withAbilityName(FunctionAbility.class.getName()) + .build(); + intent.setOperation(operation); + startAbility(intent); + } + }); } } diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainJavaAbility.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainJavaAbility.java new file mode 100644 index 0000000..dcc0812 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MainJavaAbility.java @@ -0,0 +1,16 @@ +package com.camnter.easycountdowntextureview.demo; + +import com.camnter.easycountdowntextureview.demo.slice.MainAbilitySlice; +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.utils.Color; +import ohos.agp.window.service.WindowManager; + +public class MainJavaAbility extends Ability { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(MainAbilitySlice.class.getName()); + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.getIntColor("#2F3F9D")); // 设置状态栏颜色 + } +} diff --git a/entry/src/main/java/com/example/countdown/MyApplication.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MyApplication.java similarity index 94% rename from entry/src/main/java/com/example/countdown/MyApplication.java rename to entry/src/main/java/com/camnter/easycountdowntextureview/demo/MyApplication.java index c65ebac..07d8633 100644 --- a/entry/src/main/java/com/example/countdown/MyApplication.java +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/MyApplication.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.example.countdown; +package com.camnter.easycountdowntextureview.demo; import ohos.aafwk.ability.AbilityPackage; /** diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/SettingActivity.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/SettingActivity.java new file mode 100644 index 0000000..9cbdf06 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/SettingActivity.java @@ -0,0 +1,16 @@ +package com.camnter.easycountdowntextureview.demo; + +import com.camnter.easycountdowntextureview.demo.slice.SettingActivitySlice; +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.utils.Color; +import ohos.agp.window.service.WindowManager; + +public class SettingActivity extends Ability { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(SettingActivitySlice.class.getName()); + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.getIntColor("#2F3F9D")); // 设置状态栏颜色 + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/ShowActivity.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/ShowActivity.java new file mode 100644 index 0000000..a2aab13 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/ShowActivity.java @@ -0,0 +1,16 @@ +package com.camnter.easycountdowntextureview.demo; + +import com.camnter.easycountdowntextureview.demo.slice.ShowActivitySlice; +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.utils.Color; +import ohos.agp.window.service.WindowManager; + +public class ShowActivity extends Ability { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(ShowActivitySlice.class.getName()); + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.getIntColor("#2F3F9D")); // 设置状态栏颜色 + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/adapter/MainAdapter.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/adapter/MainAdapter.java new file mode 100644 index 0000000..69c4b0f --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/adapter/MainAdapter.java @@ -0,0 +1,72 @@ +package com.camnter.easycountdowntextureview.demo.adapter; + +import com.camnter.easycountdowntextureview.demo.ResourceTable; +import ohos.aafwk.ability.Ability; +import ohos.agp.components.BaseItemProvider; +import ohos.agp.components.Component; +import ohos.agp.components.ComponentContainer; +import ohos.agp.components.Image; +import ohos.agp.components.LayoutScatter; +import ohos.agp.components.Text; + +/** + * 文件描述 + * + * @since 2021-09-23 + */ +public class MainAdapter extends BaseItemProvider { + + private final Ability mActivity; + private final LayoutScatter mInflater; + private final String items[]; + + public MainAdapter(Ability ability, String items[]) { + mActivity = ability; + this.items = items; + mInflater = LayoutScatter.getInstance(ability); + } + + @Override + public int getCount() { + return items == null ? 0 : items.length; + } + + @Override + public Object getItem(int position) { + if (items != null && position >= 0 && position < items.length) { + return items[position]; + } + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public Component getComponent(int position, Component component, ComponentContainer componentContainer) { + ViewHolder holder; + if (component == null) { + component = mInflater.parse(ResourceTable.Layout_list_item_imager, componentContainer, false); + holder = new ViewHolder(component); + } else { + holder = (ViewHolder) component.getTag(); + } + + holder.title.setText(items[position]+""); + + return component; + } + + private class ViewHolder { + Text title; + Image icon; + Text dec; + + public ViewHolder(Component view) { + title = (Text) view.findComponentById(ResourceTable.Id_title); + view.setTag(this); + } + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/CompletedActivitySlice.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/CompletedActivitySlice.java new file mode 100644 index 0000000..523c1f2 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/CompletedActivitySlice.java @@ -0,0 +1,62 @@ +package com.camnter.easycountdowntextureview.demo.slice; + +import com.camnter.easycountdowntextureview.EasyCountDownTextureView; +import com.camnter.easycountdowntextureview.demo.ResourceTable; +import ohos.aafwk.ability.AbilitySlice; +import ohos.aafwk.content.Intent; +import ohos.agp.components.Component; +import ohos.agp.components.ComponentContainer; +import ohos.agp.components.LayoutScatter; +import ohos.agp.components.Text; +import ohos.agp.window.dialog.ToastDialog; +import ohos.app.Context; + +public class CompletedActivitySlice extends AbilitySlice implements EasyCountDownTextureView.EasyCountDownListener{ + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_completed_activity); + + EasyCountDownTextureView easyCountDownTextureView1 = (EasyCountDownTextureView) findComponentById(ResourceTable.Id_easycountdown1); + EasyCountDownTextureView easyCountDownTextureView2 = (EasyCountDownTextureView) findComponentById(ResourceTable.Id_easycountdown2); + easyCountDownTextureView1.setEasyCountDownListener(this); + easyCountDownTextureView2.setEasyCountDownListener(this); + } + + @Override + public void onActive() { + super.onActive(); + } + + @Override + public void onForeground(Intent intent) { + super.onForeground(intent); + } + + @Override + public void onCountDownStart() { + + } + + @Override + public void onCountDownTimeError() { + + } + + @Override + public void onCountDownStop(long millisInFuture) { + + } + + @Override + public void onCountDownCompleted() { + showToast(this, "[CompletedActivity] [onCountDownCompleted]"); + } + + public static void showToast(Context var0, String var1) { + Component var2 = LayoutScatter.getInstance(var0).parse(ResourceTable.Layout_layout_toast, (ComponentContainer)null, false); + Text var3 = (Text)var2.findComponentById(ResourceTable.Id_text_msg_toast); + var3.setText(var1); + (new ToastDialog(var0)).setComponent(var2).setTransparent(true).show(); + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/MainAbilitySlice.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/MainAbilitySlice.java new file mode 100644 index 0000000..5c8da34 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/MainAbilitySlice.java @@ -0,0 +1,63 @@ +package com.camnter.easycountdowntextureview.demo.slice; + +import com.camnter.easycountdowntextureview.demo.CompletedActivity; +import com.camnter.easycountdowntextureview.demo.ResourceTable; +import com.camnter.easycountdowntextureview.demo.SettingActivity; +import com.camnter.easycountdowntextureview.demo.ShowActivity; +import com.camnter.easycountdowntextureview.demo.adapter.MainAdapter; +import ohos.aafwk.ability.Ability; +import ohos.aafwk.ability.AbilitySlice; +import ohos.aafwk.content.Intent; +import ohos.aafwk.content.Operation; +import ohos.agp.components.Component; +import ohos.agp.components.ListContainer; + +public class MainAbilitySlice extends AbilitySlice { + private MainAdapter adapter; + private ListContainer llview; + final static String items[] = {"ShowActivity", "SettingActivity", "CompletedActivity"}; + + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_main); + llview = (ListContainer) findComponentById(ResourceTable.Id_theListView); + + adapter = new MainAdapter(getAbility(), items); + llview.setItemProvider(adapter); + + llview.setItemClickedListener(new ListContainer.ItemClickedListener() { + @Override + public void onItemClicked(ListContainer listContainer, Component component, int arg2, long l) { + if (arg2 == 0) { + startOpenAbility(getAbility(), ShowActivity.class.getName()); + } else if (arg2 == 1) { + startOpenAbility(getAbility(), SettingActivity.class.getName()); + } else if (arg2 == 2) { + startOpenAbility(getAbility(), CompletedActivity.class.getName()); + } + } + }); + } + + @Override + public void onActive() { + super.onActive(); + } + + @Override + public void onForeground(Intent intent) { + super.onForeground(intent); + } + + public void startOpenAbility(Ability ability, String name) { + Intent intent = new Intent(); + Operation operation = new Intent.OperationBuilder() + .withDeviceId("") + .withBundleName(ability.getBundleName()) + .withAbilityName(name) + .build(); + intent.setOperation(operation); + startAbility(intent); + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/SettingActivitySlice.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/SettingActivitySlice.java new file mode 100644 index 0000000..2a5538c --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/SettingActivitySlice.java @@ -0,0 +1,54 @@ +package com.camnter.easycountdowntextureview.demo.slice; + +import com.camnter.easycountdowntextureview.EasyCountDownTextureView; +import com.camnter.easycountdowntextureview.demo.ResourceTable; +import ohos.aafwk.ability.AbilitySlice; +import ohos.aafwk.content.Intent; +import ohos.agp.components.Component; + +public class SettingActivitySlice extends AbilitySlice implements Component.ClickedListener { + private EasyCountDownTextureView easyCountDownTextureView; + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_setting_activity); + easyCountDownTextureView = (EasyCountDownTextureView) findComponentById(ResourceTable.Id_easycountdown); + + this.findComponentById(ResourceTable.Id_setting_hour_button).setClickedListener(this); + this.findComponentById(ResourceTable.Id_setting_minute_button).setClickedListener(this); + this.findComponentById(ResourceTable.Id_setting_second_button).setClickedListener(this); + this.findComponentById(ResourceTable.Id_setting_start_button).setClickedListener(this); + this.findComponentById(ResourceTable.Id_setting_stop_button).setClickedListener(this); + } + + @Override + public void onActive() { + super.onActive(); + } + + @Override + public void onForeground(Intent intent) { + super.onForeground(intent); + } + + @Override + public void onClick(Component component) { + switch (component.getId()) { + case ResourceTable.Id_setting_hour_button: + easyCountDownTextureView.setTimeHour(1); + break; + case ResourceTable.Id_setting_minute_button: + easyCountDownTextureView.setTimeMinute(1); + break; + case ResourceTable.Id_setting_second_button: + easyCountDownTextureView.setTimeSecond(1); + break; + case ResourceTable.Id_setting_start_button: + easyCountDownTextureView.start(); + break; + case ResourceTable.Id_setting_stop_button: + easyCountDownTextureView.stop(); + break; + } + } +} diff --git a/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/ShowActivitySlice.java b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/ShowActivitySlice.java new file mode 100644 index 0000000..02f0fb2 --- /dev/null +++ b/entry/src/main/java/com/camnter/easycountdowntextureview/demo/slice/ShowActivitySlice.java @@ -0,0 +1,23 @@ +package com.camnter.easycountdowntextureview.demo.slice; + +import com.camnter.easycountdowntextureview.demo.ResourceTable; +import ohos.aafwk.ability.AbilitySlice; +import ohos.aafwk.content.Intent; + +public class ShowActivitySlice extends AbilitySlice { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_show_activity); + } + + @Override + public void onActive() { + super.onActive(); + } + + @Override + public void onForeground(Intent intent) { + super.onForeground(intent); + } +} diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index 94f3052..fa1ae7f 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -11,6 +11,18 @@ { "name": "app_name", "value": "EasyCountDownTextureView" + }, + { + "name": "functionability_description", + "value": "Java_Empty Ability" + }, + { + "name": "functionability_HelloWorld", + "value": "Hello World" + }, + { + "name": "entry_FunctionAbility", + "value": "entry_FunctionAbility" } ] } \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/background_ability_function.xml b/entry/src/main/resources/base/graphic/background_ability_function.xml new file mode 100644 index 0000000..a002c23 --- /dev/null +++ b/entry/src/main/resources/base/graphic/background_ability_function.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/toast_bg.xml b/entry/src/main/resources/base/graphic/toast_bg.xml new file mode 100644 index 0000000..5736716 --- /dev/null +++ b/entry/src/main/resources/base/graphic/toast_bg.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/ability_completed_activity.xml b/entry/src/main/resources/base/layout/ability_completed_activity.xml new file mode 100644 index 0000000..e6fbc6e --- /dev/null +++ b/entry/src/main/resources/base/layout/ability_completed_activity.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/ability_function.xml b/entry/src/main/resources/base/layout/ability_function.xml new file mode 100644 index 0000000..4baef79 --- /dev/null +++ b/entry/src/main/resources/base/layout/ability_function.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + +