From 20016faf843ab98540783d6312517bf877464ea7 Mon Sep 17 00:00:00 2001 From: Raymond Yang Date: Mon, 22 May 2023 12:23:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=87=E6=99=82=E9=87=9D=E3=80=81=E5=88=86?= =?UTF-8?q?=E9=87=9D=E4=B9=9F=E6=94=B9=E7=94=A8bitmap=E6=97=8B=E8=BD=89?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E7=B9=AA=E8=A3=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iosclockwidget/ClockUpdateService.kt | 8 +- .../iosclockwidget/receiver/IOSClockWidget.kt | 32 +++- .../main/res/drawable-nodpi/img_hour_hand.png | Bin 0 -> 1381 bytes .../res/drawable-nodpi/img_minute_hand.png | Bin 0 -> 1505 bytes .../res/drawable-nodpi/img_second_hand.png | Bin 2469 -> 2698 bytes app/src/main/res/drawable/img_clock_dash.xml | 150 +++++++++--------- .../main/res/layout/i_o_s_clock_widget.xml | 38 ++++- 7 files changed, 142 insertions(+), 86 deletions(-) create mode 100644 app/src/main/res/drawable-nodpi/img_hour_hand.png create mode 100644 app/src/main/res/drawable-nodpi/img_minute_hand.png diff --git a/app/src/main/java/com/ray650128/iosclockwidget/ClockUpdateService.kt b/app/src/main/java/com/ray650128/iosclockwidget/ClockUpdateService.kt index df9dc78..5b39027 100644 --- a/app/src/main/java/com/ray650128/iosclockwidget/ClockUpdateService.kt +++ b/app/src/main/java/com/ray650128/iosclockwidget/ClockUpdateService.kt @@ -23,11 +23,15 @@ class ClockUpdateService : Service() { if (isScreenOn) { val calendar = Calendar.getInstance() val second = calendar[Calendar.SECOND] + val minute = calendar[Calendar.MINUTE] + val hour = calendar[Calendar.HOUR] val millisecond = calendar[Calendar.MILLISECOND] // 計算時、分、秒的旋轉角度 secondAngle = ((second + (millisecond / 1000f)) * 360f / 60f)//(second * 360f / 60f) + minuteAngle = ((minute + (second / 60f)) * 360f / 60f)//(second * 360f / 60f) + hourAngle = ((hour + (minute / 60f)) * 360f / 12f)//(second * 360f / 60f) sendWidgetIntent() - Thread.sleep(100) + Thread.sleep(50) } } } @@ -142,6 +146,8 @@ class ClockUpdateService : Service() { var isServiceRunning = false var secondAngle = 0f + var minuteAngle = 0f + var hourAngle = 0f const val SECOND_CHANGED = "SECOND_CHANGED" const val SECOND_ANGLE = "SECOND_ANGLE" diff --git a/app/src/main/java/com/ray650128/iosclockwidget/receiver/IOSClockWidget.kt b/app/src/main/java/com/ray650128/iosclockwidget/receiver/IOSClockWidget.kt index 22a70be..a44d4ec 100644 --- a/app/src/main/java/com/ray650128/iosclockwidget/receiver/IOSClockWidget.kt +++ b/app/src/main/java/com/ray650128/iosclockwidget/receiver/IOSClockWidget.kt @@ -62,19 +62,37 @@ internal fun updateClockWidget( // Construct the RemoteViews object val views = RemoteViews(context.packageName, R.layout.i_o_s_clock_widget) views.setTextViewText(R.id.appwidget_text, widgetText) - val bmpOriginal = BitmapFactory.decodeResource(context.applicationContext.resources, + val bmpSecond = BitmapFactory.decodeResource(context.applicationContext.resources, R.drawable.img_second_hand ) - val bmpResult = Bitmap.createBitmap(285, 285, Bitmap.Config.ARGB_8888) - val tempCanvas = Canvas(bmpResult) - tempCanvas.rotate(ClockUpdateService.secondAngle, 285 / 2.toFloat(), 285 / 2.toFloat()) - tempCanvas.drawBitmap(bmpOriginal, 0f, 0f, null) - views.setImageViewBitmap(R.id.imageView, bmpResult) + val bmpMinute = BitmapFactory.decodeResource(context.applicationContext.resources, + R.drawable.img_minute_hand + ) + val bmpHour = BitmapFactory.decodeResource(context.applicationContext.resources, + R.drawable.img_hour_hand + ) + val bmpSecondResult = Bitmap.createBitmap(285, 285, Bitmap.Config.ARGB_8888) + val tempSecondCanvas = Canvas(bmpSecondResult) + tempSecondCanvas.rotate(ClockUpdateService.secondAngle, 285 / 2.toFloat(), 285 / 2.toFloat()) + tempSecondCanvas.drawBitmap(bmpSecond, 0f, 0f, null) + views.setImageViewBitmap(R.id.imgSec, bmpSecondResult) + + val bmpMinuteResult = Bitmap.createBitmap(285, 285, Bitmap.Config.ARGB_8888) + val tempMinuteCanvas = Canvas(bmpMinuteResult) + tempMinuteCanvas.rotate(ClockUpdateService.minuteAngle, 285 / 2.toFloat(), 285 / 2.toFloat()) + tempMinuteCanvas.drawBitmap(bmpMinute, 0f, 0f, null) + views.setImageViewBitmap(R.id.imgMinute, bmpMinuteResult) + + val bmpHourResult = Bitmap.createBitmap(285, 285, Bitmap.Config.ARGB_8888) + val tempCanvas = Canvas(bmpHourResult) + tempCanvas.rotate(ClockUpdateService.hourAngle, 285 / 2.toFloat(), 285 / 2.toFloat()) + tempCanvas.drawBitmap(bmpHour, 0f, 0f, null) + views.setImageViewBitmap(R.id.imgHour, bmpHourResult) // Click to call Alarm val alarmClockIntent = Intent("android.intent.action.SHOW_ALARMS") val pendingIntent = PendingIntent.getActivity(context, 0, alarmClockIntent, PendingIntent.FLAG_IMMUTABLE) - views.setOnClickPendingIntent(R.id.imageView, pendingIntent) + views.setOnClickPendingIntent(R.id.imgSec, pendingIntent) // Instruct the widget manager to update the widget appWidgetManager.updateAppWidget(appWidgetId, views) diff --git a/app/src/main/res/drawable-nodpi/img_hour_hand.png b/app/src/main/res/drawable-nodpi/img_hour_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..15b466feaa8505fd354f5cb5f43e4ef7ad7965c1 GIT binary patch literal 1381 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y-64mO~OVb&t6ql8rAprV2W4DOS9= z$@QV_ErSc(mQE49zIS#pUoSp?XXm~TI~Y z%U@4yc)SXGoF?Pr?WoYX&7O7;Wna@L zl~3LicKz=CFtNL-exTUXzPNJLxxJot-k)BW`n-It;(xvL`|%Dw-55chm#)iKS#4MU zsdX~>y5T}&Pr3E4-@OOMIsc@{v$L;D&iQiQI%U(AkJ%lHv&}+7C%vB)Z?YzOyWa2b z@6WG`J)fSIruO;sXUoDzDSYyFb52j!H~&9-sS5vG`}pcSqwtv~e6yABxgm zSFVKg$yVF%E`NWjjaS;p((>o|{n6X=&Th-SUG(b8N*!HY-g%d*MfdL5QSs56Ic>uB z@GX^_c5chRzc1(JrlqCD`L*xw?aghUXB0cjrQM9*D z_h;$(E^?l&KP!9h`lILP+1}o@b9>#B6BD;N&!4U5yU!^7#FsB6@28$S-MoKFRebyT zvuB^4n!0~e;p1a#;`iH$>&2Y7xcGf)Sy|cE{g*2X3qL+uuXaYEUgpGvf4Ktrs+I-J zmn(O#+s%H5&2jSf@HNj8{>!a;UAU~?jz>^7>T2oteiiHA<-PIU_x{b@JKNTGn%Sbm ztA6z_zcKI0+<)mNi*>$!&yBBK!@A{T+ib;V{*O_Cp>xmvRcE)G{^X#_ca@(j>yuv` p2lDyu-g#*ZETje<$n%-BpYfON{k9E{OmD literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/img_minute_hand.png b/app/src/main/res/drawable-nodpi/img_minute_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..ccac6c199a3c69cf653c50dd73b2bb021c52b5eb GIT binary patch literal 1505 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y-64mO~OVbX$Bre3MZL8*LfFdovikpmw)@=hWB$?S*J@pFLpIps&D0MyhH!wY|nKsET5K4 zx|?hLXF;_?$%`VOob=pfk~!X=TqkL#`(%sEi@sg<mavd;?t&-pE9;CoHk>P+(MIltGLLzo}y?;UsbDQO5=#5_evcEOYv3`OZwr$rga?FtJIuTH;Y((E{C--euQl%$cm_QjL= zAADqUZa&8X9g#A5BSX7b9zrE zoAhLx*-t*IOg}s0n!IP6=O>@reD${5U+5L@iV^g&6bB}{nAuMbt8D+tyWY)6(X7XI`)0Kh0h4=G3#Z&C?4DKfa%DUH0b0xw+QGZ*FW{ zvu2IYJfkYny?gfjIjzoiMkRm!i{kR~-1qnP-rQGP{r=g-U-N9MfAQT--c{1cSDW`{ zUGKf1vqn{{S00O9Ug}-)qPVm?_lx8?oot!?r%GN5$^QCtBUZXL!{+qL;N`#i{-uDm z?R&RQ*0QMN*@Amjuix%_s_#2p@8ZJq$M0^vc>U4we);!zZKCW;UIg4<*zYr4FMg(R zYG!8U7q91?C+)o!uRq)`XFF?i`u{W2bfY(AUS2lGqEM-wfB!6IcD^-V>#h2A_5Xj` z%xQemp4}+5M*2v%=e$4smn&E1w)^kmZPLqMA94EMN81qbN1H$XG;l3>adq3_`;%=< z_GSOMFY&fMqh#~)lb75}A};^mdK II;Vst0BzuPUH||9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/img_second_hand.png b/app/src/main/res/drawable-nodpi/img_second_hand.png index 8559103eda6cd5cab2286c7b83342da02067cda1..bb8122cc514a91bea0a5b1ec861081bb9ed09c4a 100644 GIT binary patch delta 797 zcmZ1~+$B1}lJU((t1c#9Q(YsY5JN*NQ%frYY65*nCm7Qq?qWMB_*318KtBer=_NBp3R)bIN6a!l({&uY;rV{)Y?X`*jEr>+P+hc-#a1=LC7#LVwJY5_^DsH{K zW1lTtD0BRyzjrN5m&tUH>6*e0jLf=aPB_i{;xVJwN;8*4dPoLEkt2 zTO_?m^LXQnfNKv@ucqbxS#|Mmc@N*kM6qzTZCclluaAn8yjOhlg@A0@$K-_7#U^!E zU;LZz*8akvySZ`g_TG=Hzs)*aZ6_tW=&(-QxBM;Q_UgS+MSoO({$2h1#tPp0D$^pF zFU9lugm?P0r(69A-|JM6v$T47p`^O!HWv1aiSs_x_->l_u6*?}OP@{mqWKpczVk5B z`%}f4)4x6EsYD9Pocdrd>y>S8HYw!?@8*ED+j-d2C);soOBE>AzOTM#$mi1j`P&-t z*^gCjA3GTNGqLQz%*huyG$-HW5X2P&Ksiqdhst_}s2NSCCfqJ>VgLe9S3j3^P6w-*T-EX|wb_Vbk#`=a{8mDzJX$+@r#$U2lTfGCEGj4tdz zHk^XX;8k#u5v~rb71X%>jJQK9++KmmZlMn8!*021iS^0PAjdl0r_ol7f!{^ez(pK_Tbfo{h zeAVlDs^WTLx6}2z1$=h_WoEU#FOu7`I=okYe{M+!-{u`QTdwa2-23X)*Ne*2d-yIU zirKe)>)RK)UdsO8ikvz5BN3^0_i~zIFe# zw#_Zu^ttd;X+hKT5{tRdOA3}BwhwJtJoS<1W2?T&TUgjHCeHitW%8P(KXR|C{Pw(d z>Z^j)8QFPHRrlfIJxOTK>PcW73;71OuA@4qxH)cw(`jf*+nMzvhz&lW9OFo zQ2(p$(cg)M3RZKrFHg + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> + android:fillColor="#B3B3B3"/> diff --git a/app/src/main/res/layout/i_o_s_clock_widget.xml b/app/src/main/res/layout/i_o_s_clock_widget.xml index c4645d9..94579b0 100644 --- a/app/src/main/res/layout/i_o_s_clock_widget.xml +++ b/app/src/main/res/layout/i_o_s_clock_widget.xml @@ -6,7 +6,7 @@ android:background="@android:color/transparent" android:theme="@style/Theme.IOSClockWidget.AppWidgetContainer"> - + android:hand_minute="@drawable/img_minute_hand" /--> + + + + + +