矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3238|回复: 17

手机上的电子钟程序APK之三(闲置手机DIY电子钟)

[复制链接]
     
发表于 2016-10-16 23:10:24 | |阅读模式
本帖最后由 翌阳 于 2017-4-27 08:35 编辑

这次加上了几个字体和颜色选项,按菜单键选择。因为加进了字体文件,APK体积一下子增加了好多。
还是比较懒,没设计更复杂的颜色选择器和外部字体。玩得差不多了,至此为止。
原系统的字体不太好看,改了几个字体装上。但我还只是喜欢那个 ubuntu-c的字体。
  1. package elezen.tclock;


  2. import java.io.IOException;
  3. import java.util.Locale;
  4. import java.util.TimeZone;

  5. import android.app.Activity;
  6. import android.content.SharedPreferences;
  7. import android.content.SharedPreferences.Editor;
  8. import android.content.res.AssetManager;
  9. import android.graphics.Color;
  10. import android.graphics.Paint;
  11. import android.graphics.Typeface;
  12. import android.os.Bundle;
  13. import android.os.Handler;
  14. import android.text.Spannable;
  15. import android.text.SpannableStringBuilder;
  16. import android.text.style.AbsoluteSizeSpan;
  17. import android.view.Menu;
  18. import android.view.MenuItem;
  19. import android.view.ViewTreeObserver;
  20. import android.view.ViewTreeObserver.OnPreDrawListener;
  21. import android.view.WindowManager;
  22. import android.widget.TextView;

  23. public class MainActivity extends Activity {
  24.     Handler handler=new Handler();         
  25.         public TextView tv=null;
  26.         private long timeZoneOffset;
  27.         private String[] fonts;
  28.         private final int SETCOLOR=10000;
  29.         private int[] colors={Color.WHITE,Color.RED,Color.BLUE,Color.CYAN,
  30.                         Color.GREEN,Color.MAGENTA,Color.YELLOW,Color.DKGRAY,Color.GRAY,Color.LTGRAY};
  31.         private String[] colorNames={"WHITE","RED","BLUE","CYAN",
  32.                         "GREEN","MAGENTA","YELLOW","DARKGRAY","GRAY","LIGHTGRAY"};
  33.         SpannableStringBuilder ssb=new SpannableStringBuilder();
  34.         AbsoluteSizeSpan has=new AbsoluteSizeSpan(64,true),
  35.                         mas=new AbsoluteSizeSpan(32,true);
  36.        

  37.         @Override
  38.         protected void onCreate(Bundle savedInstanceState) {
  39.                 super.onCreate(savedInstanceState);
  40.                 setContentView(R.layout.activity_main);
  41.                 tv=(TextView)findViewById(R.id.t1);
  42.                 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  43.             timeZoneOffset=TimeZone.getDefault().getRawOffset();

  44.             AssetManager assets=getAssets();
  45.                 try {
  46.                         fonts=assets.list("fonts");
  47.                 } catch (IOException e) {
  48.                         e.printStackTrace();
  49.                 }
  50.                
  51.         SharedPreferences sp =getSharedPreferences("Settings", MODE_PRIVATE);
  52.         int id=sp.getInt("COLOR",0);
  53.         if(id>=0 && id<colors.length)tv.setTextColor(colors[id]);
  54.         id=sp.getInt("FONT",0);
  55.         if(id>=0 && id<fonts.length){
  56.                 Typeface fontFace = Typeface.createFromAsset(getAssets(),
  57.                 "fonts/"+fonts[id]);
  58.                 tv.setTypeface(fontFace);
  59.         }
  60.                 autoFit();
  61.                

  62.         }

  63.        
  64.         @Override
  65.         protected void onResume(){
  66.                 super.onResume();
  67.                 handler.post(runnable);
  68.         }

  69.         @Override
  70.         protected void onPause(){
  71.                 super.onPause();
  72.                 handler.removeCallbacks(runnable);   
  73.         }
  74.        
  75.         @Override
  76.     public boolean onCreateOptionsMenu(Menu menu)  
  77.     {  
  78.                 int i=0;
  79.                 for (String s : fonts){
  80.                         menu.add(1,i,i,s.replace(".ttf", getResources().getString(R.string.font)));
  81.                         i++;
  82.                 }
  83.                 i=SETCOLOR;
  84.                 for (String s:colorNames){
  85.                         menu.add(2, i, i,s+getResources().getString(R.string.color));
  86.                         i++;
  87.                 }
  88.         return true;  
  89.     }  
  90.   
  91.         @Override  
  92.     public boolean onOptionsItemSelected(MenuItem item)  
  93.     {  

  94.         int id = item.getItemId();  
  95.         if(id>=0 && id<fonts.length){
  96.                     Typeface fontFace = Typeface.createFromAsset(getAssets(),
  97.                     "fonts/"+fonts[id]);
  98.                     tv.setTypeface(fontFace);
  99.                     autoFit();
  100.             SharedPreferences sp =getSharedPreferences("Settings", MODE_PRIVATE);
  101.             Editor editor=sp.edit();
  102.             editor.putInt("FONT",id);
  103.             editor.commit();                       
  104.         }else if(id>=SETCOLOR){
  105.                 id-=SETCOLOR;
  106.                 if(id<colors.length){
  107.                         tv.setTextColor(colors[id]);
  108.                 SharedPreferences sp =getSharedPreferences("Settings", MODE_PRIVATE);
  109.                 Editor editor=sp.edit();
  110.                 editor.putInt("COLOR",id);
  111.                 editor.commit();                       
  112.                 }
  113.         }
  114.         return true;  
  115.     }  
  116.        
  117.        
  118.        
  119.         Runnable runnable=new Runnable() {  
  120.         @Override  
  121.         public void run() {  
  122.                 long t=System.currentTimeMillis();
  123.                 ssb.replace(0, ssb.length(), getTime(t));
  124.                         ssb.setSpan(has, 0, 5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
  125.                         ssb.setSpan(mas, 5, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

  126.                 tv.setText(ssb);
  127.             handler.postDelayed(this, 1000-t%1000);  
  128.         }  
  129.     };  


  130.     private final CharSequence getTime(long t) {
  131.         long h,m,s;
  132.         t+=timeZoneOffset;
  133.         h=t/(60*60*1000) % 12;
  134.         if(h==0)h=12;
  135.         m=t/(60*1000)%60;
  136.         s=t/1000%60;
  137.         return String.format(Locale.US, "%2d:%02d:%02d", h,m,s);
  138.     }

  139.     private final void autoFit(){
  140.         ViewTreeObserver greenObserver = tv.getViewTreeObserver();
  141.         greenObserver.addOnPreDrawListener(new OnPreDrawListener() {

  142.             @Override
  143.             public boolean onPreDraw() {
  144.                     Paint p=tv.getPaint();
  145.                     float tw,textSize;
  146.                 tv.getViewTreeObserver().removeOnPreDrawListener(this);
  147.                 float w = tv.getWidth()-tv.getPaddingLeft()-tv.getPaddingRight();
  148.                         p.setTextSize(240F);
  149.                         tw=p.measureText("00:00");
  150.                         p.setTextSize(120F);
  151.                         tw+=p.measureText(":00");
  152.                         textSize=240F*w/tw;
  153.                                has=new AbsoluteSizeSpan((int) textSize,false);
  154.                                mas=new AbsoluteSizeSpan((int) textSize/2,false);
  155.                 return true;
  156.             }
  157.         });

  158.     }
  159. }
复制代码
编译好的程序: Tclock.zip (85.84 KB, 下载次数: 141)

到网上找了个COLORPICKER,加上了,这回颜色更丰富了,按外圈选择颜色,按中心确定。
更新后的APK: Tclock.zip (89.09 KB, 下载次数: 142)

又加了不少字体,共30种了: Tclock.zip (149.38 KB, 下载次数: 121)

对字库文件进行了清理,省了不少空间。33种字体: Tclock.zip (85.33 KB, 下载次数: 115)

又优化一下代码: Tclock.zip (85.41 KB, 下载次数: 137)

增加了全屏显示选择项: Tclock33FullSrc.zip (85.85 KB, 下载次数: 137)

发现存在个问题,那就是在新版的某些系统中,比如ANDROID5.0 6.0什么的,它们取消了菜单键!这样就没有办法打开菜单了。改了一下,可以向上滑动打开菜单: Tclock33FullSlideMenu.zip (86.07 KB, 下载次数: 192)
不过确实没有想到这方面的问题,因为我的手机(MOKEE51)是有菜单键的,而华为的荣耀7,却是没有菜单键。但不会有人把这么好的手机也闲置吧,嗯,也不好说,毕竟IPHONE5S都闲置了啊。于是,还是改一下吧,至少将来也许会用上。

发现这东西又被关心了,上传个最新优化版本(也没优化个啥,只是做了资源对齐,zipalign,后来学习到的,说是这样做会提高APK资源的读取速度,减小内存占用): Tclock.new.zip (86.13 KB, 下载次数: 199)

截图:
Screenshot_2016-10-16-23-07-06.png
Screenshot_2016-10-16-23-07-21.png
Screenshot_2016-10-16-23-07-33.png
     
发表于 2016-10-18 20:42:30 |
下载玩玩。谢谢了
     
发表于 2016-10-20 06:00:55 来自手机 |
版主,把手机改成行车记录仪,写个软件吧。网上的都有广告。
     
发表于 2016-10-20 13:59:46 |
这个几款感觉点阵字体比较好看
     
 楼主| 发表于 2016-10-20 23:07:03 |
LI192721 发表于 2016-10-20 06:00
版主,把手机改成行车记录仪,写个软件吧。网上的都有广告。

这个还没学会呢。写这个怕是比写个电子钟程序要麻烦得多了。
发表于 2016-10-21 15:04:44 |
     
发表于 2016-10-22 09:53:33 |
这个不错啊,废物利用了,还学习实践了单片机,顶楼主。
发表于 2016-10-23 14:58:58 |
能不能加入铃声,渐响那种,然后屏幕亮度也加大或者闪烁。。
     
发表于 2016-10-24 09:42:20 |
想法不错,支持!
     
发表于 2016-10-25 10:23:08 来自手机 |
下来试用了,很好,谢谢楼主!
发表于 2016-10-25 10:54:18 |
提示: 作者被禁止或删除 内容自动屏蔽
     
 楼主| 发表于 2016-10-26 20:49:42 |
b7d10289541 发表于 2016-10-25 10:54
非常不错,感谢楼主分享。。。第一版是全屏的,这个可以设置全屏么。。

好,应要求,增加了全屏选项。
发表于 2016-10-26 21:17:32 |
提示: 作者被禁止或删除 内容自动屏蔽
     
发表于 2016-10-26 23:54:10 |
提示: 作者被禁止或删除 内容自动屏蔽
     
发表于 2016-10-30 09:00:57 |

RE: 手机上的电子钟程序APK之三(闲置手机DIY电子钟)

首先谢谢分享!
请问:安卓2.0...老平板上是否可用?有沒有系统版本要求?

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-3-29 03:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表