android开发过程中遇到的问题_April0815的博客-程序员秘密

技术标签: android  

Android系统中,默认的单位是像素(px)。也就是说,在没有明确说明的情况下,所有的大小设置都是以像素为单位。

如果以像素设置大小,会导致不同分辨率下出现不同的效果。那么,如何将应用中所有大小的单位都设置为’dp’呢?
实际上TextView.setTextSize()重载了根据单位设置大小的方法。

笔者在此基础上实现了以下方法:

Java代码   收藏代码
  1. /** 
  2.  * 获取当前分辨率下指定单位对应的像素大小(根据设备信息) 
  3.  * px,dip,sp -> px 
  4.  *  
  5.  * Paint.setTextSize()单位为px 
  6.  *  
  7.  * 代码摘自:TextView.setTextSize() 
  8.  *  
  9.  * @param unit  TypedValue.COMPLEX_UNIT_* 
  10.  * @param size 
  11.  * @return 
  12.  */  
  13. public float getRawSize(int unit, float size) {  
  14.        Context c = getContext();  
  15.        Resources r;  
  16.   
  17.        if (c == null)  
  18.            r = Resources.getSystem();  
  19.        else  
  20.            r = c.getResources();  
  21.           
  22.        return TypedValue.applyDimension(unit, size, r.getDisplayMetrics());  
  23. }   

 

 

下面是网友提供的方法:

Java代码   收藏代码
  1. /** 
  2. * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
  3. */  
  4. public static int dip2px(Context context, float dpValue) {  
  5.   final float scale = context.getResources().getDisplayMetrics().density;  
  6.   return (int) (dpValue * scale + 0.5f);  
  7. }  
  8.   
  9. /** 
  10. * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
  11. */  
  12. public static int px2dip(Context context, float pxValue) {  
  13.   final float scale = context.getResources().getDisplayMetrics().density;  
  14.   return (int) (pxValue / scale + 0.5f);  
  15. }   

 

Android使用BitmapFactory.Options获取图片文件类型(mime)

Android系统中在读取图片时可通过BitmapFactory.Options的outMimeType来直接读取其图片类型。如果要知道一个文件的类型,最好方式是直接读取文件头信息,可查看Android中Java根据文件头获取文件类型

参考代码:

Java代码   收藏代码
  1. BitmapFactory.Options opts = new BitmapFactory.Options();  
  2. opts.inJustDecodeBounds = true//确保图片不加载到内存  
  3. BitmapFactory.decodeResource(getResources(), R.drawable.a, opts);  
  4. System.out.println(opts.outMimeType);   

 

 

Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。

1、异常处理类,代码如下:

Java代码   收藏代码
  1. public class CrashHandler implements UncaughtExceptionHandler {  
  2.     public static final String TAG = "CrashHandler";  
  3.     private static CrashHandler INSTANCE = new CrashHandler();  
  4.     private Context mContext;  
  5.     private Thread.UncaughtExceptionHandler mDefaultHandler;  
  6.   
  7.     private CrashHandler() {  
  8.     }  
  9.   
  10.     public static CrashHandler getInstance() {  
  11.         return INSTANCE;  
  12.     }  
  13.   
  14.     public void init(Context ctx) {  
  15.         mContext = ctx;  
  16.         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  
  17.         Thread.setDefaultUncaughtExceptionHandler(this);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void uncaughtException(Thread thread, Throwable ex) {  
  22.         // if (!handleException(ex) && mDefaultHandler != null) {   
  23.         // mDefaultHandler.uncaughtException(thread, ex);  
  24.         // } else {   
  25.         // android.os.Process.killProcess(android.os.Process.myPid());  
  26.         // System.exit(10);  
  27.         // }  
  28.         System.out.println("uncaughtException");  
  29.   
  30.         new Thread() {  
  31.             @Override  
  32.             public void run() {  
  33.                 Looper.prepare();  
  34.                 new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)  
  35.                         .setMessage("程序崩溃了...").setNeutralButton("我知道了"new OnClickListener() {  
  36.                             @Override  
  37.                             public void onClick(DialogInterface dialog, int which) {  
  38.                                 System.exit(0);  
  39.                             }  
  40.                         })  
  41.                         .create().show();  
  42.                 Looper.loop();  
  43.             }  
  44.         }.start();  
  45.     }  
  46.   
  47.     /** 
  48.      * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑 
  49.      *  
  50.      * @param ex 
  51.      * @return true:如果处理了该异常信息;否则返回false 
  52.      */  
  53.     private boolean handleException(Throwable ex) {  
  54.         if (ex == null) {  
  55.             return true;  
  56.         }  
  57.         // new Handler(Looper.getMainLooper()).post(new Runnable() {   
  58.         // @Override  
  59.         // public void run() {   
  60.         // new AlertDialog.Builder(mContext).setTitle("提示")  
  61.         // .setMessage("程序崩溃了...").setNeutralButton("我知道了", null)  
  62.         // .create().show();  
  63.         // }  
  64.         // });  
  65.   
  66.         return true;  
  67.     }  
  68. }   

 

2、线程绑定异常处理类

Java代码   收藏代码
  1. public class CrashHandlerActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         CrashHandler crashHandler = CrashHandler.getInstance();    
  8.         crashHandler.init(this);  //传入参数必须为Activity,否则AlertDialog将不显示。  
  9.         // 创建错误  
  10.         throw new NullPointerException();  
  11.     }  
  12. }   

 

TextView属性android:ellipsize实现跑马灯效果

Android系统中TextView实现跑马灯效果,必须具备以下几个条件:
1、android:ellipsize=”marquee”
2、TextView必须单行显示,即内容必须超出TextView大小
3、TextView要获得焦点才能滚动

XML代码:

Java代码   收藏代码
  1. android:ellipsize="marquee", android:singleLine="true"   

 

1
android:ellipsize="marquee", android:singleLine="true"

Java代码:

Java代码   收藏代码
  1. mTVText.setText("哼唱接撒砥砺风节雷锋精神http://orgcent.com/,很长很长很长很长很长很长的数据");  
  2. mTVText.setSingleLine(true);  
  3. mTVText.setEllipsize(TruncateAt.MARQUEE);   

 

1
2
3
mTVText. setText ( "哼唱接撒砥砺风节雷锋精神http://orgcent.com/,很长很长很长很长很长很长的数据" ) ;
mTVText. setSingleLine ( true ) ;
mTVText. setEllipsize (TruncateAt. MARQUEE ) ;

PS: TextView.setHorizontallyScrolling(true); //让文字可以水平滑动

TextView还可以设置跑马灯效果的滚动次数,如下:
XML代码设置:

Java代码   收藏代码
  1. android:marqueerepeatlimit="1"1代表1次,-1代表无限循环。   

 

1
android :marqueerepeatlimit = "1"1代表 1次, - 1代表无限循环。

Java代码设置:

 

1
mTVText. setMarqueeRepeatLimit ( - 1 ) ;
Java代码   收藏代码
  1. mTVText.setMarqueeRepeatLimit(-1);   

 

Android闹钟程序周期循环提醒源码(AlarmManager)

Android系统提供了AlarmManager类来管理闹钟定时提醒任务。通过AlarmManager实现定时提醒及定时循环提醒。那么,AlarmManager类可以应用到以下场景:
1、定时循环启动组件(Component,如Activity、BroadcastReceiver),这样能替代在后台启动Service进行定时提醒任务
2、实现闹钟的按小时、天、周等形式的定时循环提醒功能。

定时启动组件很简单,下面贴出闹钟按天、周形式的定时循环提醒功能的核心代码。此功能核心的是计算出下一次闹钟提醒时间,代码如下:

Java代码   收藏代码
  1. /** 
  2.  * 闹钟三种设置模式(dateMode): 
  3.  * 1、DATE_MODE_FIX:指定日期,如20120301   , 参数dateValue格式:2012-03-01 
  4.  * 2、DATE_MODE_WEEK:按星期提醒,如星期一、星期三 ,  参数dateValue格式:1,3 
  5.  * 3、DATE_MODE_MONTH:按月提醒,如3月2、3号,4月2、3号,  参数dateValue格式:3,4|2,3 
  6.  *   
  7.  * startTime:为当天开始时间,如上午9点, 参数格式为09:00 
  8.  */  
  9. public static long getNextAlarmTime(int dateMode, String dateValue,  
  10.         String startTime) {  
  11.     final SimpleDateFormat fmt = new SimpleDateFormat();  
  12.     final Calendar c = Calendar.getInstance();  
  13.     final long now = System.currentTimeMillis();  
  14.   
  15.     // 设置开始时间  
  16.     try {  
  17.         if(Task.DATE_MODE_FIX == dateMode) {  
  18.             fmt.applyPattern("yyyy-MM-dd");  
  19.             Date d = fmt.parse(dateValue);  
  20.             c.setTimeInMillis(d.getTime());  
  21.         }  
  22.           
  23.         fmt.applyPattern("HH:mm");  
  24.         Date d = fmt.parse(startTime);  
  25.         c.set(Calendar.HOUR_OF_DAY, d.getHours());  
  26.         c.set(Calendar.MINUTE, d.getMinutes());  
  27.         c.set(Calendar.SECOND, 0);  
  28.         c.set(Calendar.MILLISECOND, 0);  
  29.     } catch (Exception e) {  
  30.         e.printStackTrace();  
  31.     }  
  32.   
  33.     long nextTime = 0;  
  34.     if (Task.DATE_MODE_FIX == dateMode) { // 按指定日期  
  35.         nextTime = c.getTimeInMillis();  
  36.         // 指定日期已过  
  37.         if (now >= nextTime) nextTime = 0;  
  38.     } else if (Task.DATE_MODE_WEEK == dateMode) { // 按周  
  39.         final long[] checkedWeeks = parseDateWeeks(dateValue);  
  40.         if (null != checkedWeeks) {  
  41.             for (long week : checkedWeeks) {  
  42.                 c.set(Calendar.DAY_OF_WEEK, (int) (week + 1));  
  43.   
  44.                 long triggerAtTime = c.getTimeInMillis();  
  45.                 if (triggerAtTime <= now) { // 下周  
  46.                     triggerAtTime += AlarmManager.INTERVAL_DAY * 7;  
  47.                 }  
  48.                 // 保存最近闹钟时间  
  49.                 if (0 == nextTime) {  
  50.                     nextTime = triggerAtTime;  
  51.                 } else {  
  52.                     nextTime = Math.min(triggerAtTime, nextTime);  
  53.                 }  
  54.             }  
  55.         }  
  56.     } else if (Task.DATE_MODE_MONTH == dateMode) { // 按月  
  57.         final long[][] items = parseDateMonthsAndDays(dateValue);  
  58.         final long[] checkedMonths = items[0];  
  59.         final long[] checkedDays = items[1];  
  60.   
  61.         if (null != checkedDays && null != checkedMonths) {  
  62.             boolean isAdd = false;  
  63.             for (long month : checkedMonths) {  
  64.                 c.set(Calendar.MONTH, (int) (month - 1));  
  65.                 for (long day : checkedDays) {  
  66.                     c.set(Calendar.DAY_OF_MONTH, (int) day);  
  67.   
  68.                     long triggerAtTime = c.getTimeInMillis();  
  69.                     if (triggerAtTime <= now) { // 下一年  
  70.                         c.add(Calendar.YEAR, 1);  
  71.                         triggerAtTime = c.getTimeInMillis();  
  72.                         isAdd = true;  
  73.                     } else {  
  74.                         isAdd = false;  
  75.                     }  
  76.                     if (isAdd) {  
  77.                         c.add(Calendar.YEAR, -1);  
  78.                     }  
  79.                     // 保存最近闹钟时间  
  80.                     if (0 == nextTime) {  
  81.                         nextTime = triggerAtTime;  
  82.                     } else {  
  83.                         nextTime = Math.min(triggerAtTime, nextTime);  
  84.                     }  
  85.                 }  
  86.             }  
  87.         }  
  88.     }  
  89.     return nextTime;  
  90. }  
  91.   
  92. public static long[] parseDateWeeks(String value) {  
  93.     long[] weeks = null;  
  94.     try {  
  95.         final String[] items = value.split(",");  
  96.         weeks = new long[items.length];  
  97.         int i = 0;  
  98.         for (String s : items) {  
  99.             weeks[i++] = Long.valueOf(s);  
  100.         }  
  101.     } catch (Exception e) {  
  102.         e.printStackTrace();  
  103.     }  
  104.     return weeks;  
  105. }  
  106.   
  107. public static long[][] parseDateMonthsAndDays(String value) {  
  108.     long[][] values = new long[2][];  
  109.     try {  
  110.         final String[] items = value.split("\\|");  
  111.         final String[] monthStrs = items[0].split(",");  
  112.         final String[] dayStrs = items[1].split(",");  
  113.         values[0] = new long[monthStrs.length];  
  114.         values[1] = new long[dayStrs.length];  
  115.   
  116.         int i = 0;  
  117.         for (String s : monthStrs) {  
  118.             values[0][i++] = Long.valueOf(s);  
  119.         }  
  120.         i = 0;  
  121.         for (String s : dayStrs) {  
  122.             values[1][i++] = Long.valueOf(s);  
  123.         }  
  124.     } catch (Exception e) {  
  125.         e.printStackTrace();  
  126.     }  
  127.     return values;  
  128. }   

 

1、异常处理类,代码如下:

1
2
3
4
BitmapFactory. Options opts  =  new BitmapFactory. Options ( ) ;
opts. inJustDecodeBounds  =  true ;  //确保图片不加载到内存
BitmapFactory. decodeResource (getResources ( ), R. drawable. a, opts ) ;
System. out. println (opts. outMimeType ) ;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013111674/article/details/42005837

智能推荐

学习 严蔚敏讲数据结构笔记11_dblion的博客-程序员秘密

2.5删除有序表中所有值大于且小于的数据元素。分析:删除的结点的特点while(p && p->data {         pre=p;         p=p->next;         if(p)         {                   while(p&& p->data                             p

双摄测距原理_一文读懂双摄像头工作原理_二楼的巴士的博客-程序员秘密

原标题:一文读懂双摄像头工作原理手机拍照自功能机时代就已经成为人们日常经常使用的一个功能,自进入智能机以来地位更是被不断的拔高。注意力所在之地往往就是创新的迸发处,这一点在手机拍照上再恰当不过,无数的技术越来越多的被应用到手机拍照上:3D拍照、背景虚化、光学变焦、光学防抖、双核对焦...以及越来越大的光圈和传感器尺寸等等,每一项技术都对手机拍照无论是照片质量还是整体体验都有非常大的提升。但,“仅仅...

如何使用部署程序进行部署_cunjie3951的博客-程序员秘密

自动化的部署工作流是每个软件开发团队都必须拥有的强大工具。 快速,安全和容错的发布过程可以节省开发更多功能的时间。 好消息是,有许多很棒的工具可以创建一个自动发布周期。 在本文中,我将向您介绍一个名为Deployer的部署工具。 我喜欢使用它,因为它是用PHP编写的,易于设置,并且具有许多方便的功能,可以将部署过程集成到团队的工作流程中。 部署者的部署过程 首先,让我们看一下Deplo...

jvm性能调优参数_jvm三大性能调优参数_冬临的博客-程序员秘密

一、jvm参数-Xms设置堆的最小空间大小。-Xmx设置堆的最大空间大小。-Xmn:设置新生代大小-XX:NewSize设置新生代最小空间大小。-XX:MaxNewSize设置新生代最大空间大小。-XX:PermSize设置永久代最小空间大小。-XX:MaxPermSize设置永久代最大空间大小。-Xss设置每个线程的堆栈大小-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。-XX:Para

为什么需要MESI缓存一致性协议_mesi为什么不能保证原子性_伟娃娃的博客-程序员秘密

运行在不同cup的2个线程,如何保证在修改相同变量的时候不发生冲突呢 ?早期的做法加总线锁:总线锁 – &gt; 早期多核cup实现一致性的方式,给总线加互斥锁,使另一个核pending住。这样通讯效率很低。现在的做法使用缓存一致性协议MESI Modified, Exclusive, Shared, Invalid如下图:T0 通过总线向主内存获取一个缓存行, 该缓存行包含变量counter=0,并加载到Core0的缓存中,这个时候会通过总线对该缓存行修改状态为E。如果T1也需要.

java提高ocr识别率_Tesseract-OCR-04-使用 jTessBoxEditor 提高文字识别准确率_细细听136的博客-程序员秘密

Tesseract-OCR-04-使用 jTessBoxEditor 提高文字识别准确率发布时间:2018-09-03 12:37,浏览次数:2151, 标签:TesseractOCRjTessBoxEditor本篇是关于 jTessBoxEditor 进行训练,使 Tesseract-OCR文字识别准确率得到极大的提高,本篇完善了很多细节,初学者也可以看懂,一起学习吧!Tesseract-OCR...

随便推点

python 遍历字符串的每一个字符的4种方式_python遍历字符串的每个字符-程序员秘密

"for in"和iter适合对字符进行直接处理的一类题目,比如大小字母,生僻字替换,字符串对比之类的。range()或xrange()和enumerate适合需要判断后续字符的场景,比如循环到下标index处,要求判断index+1的字符。最典型的题目就是语法解析器,判断"(())"这种成对的括号的算法。

利用stm32cubemx生成单极性倍频spwm调制代码步骤_stm32生成spwm_m0_65265936的博客-程序员秘密

利用stm32cubemx生成单极性倍频spwm调制代码;基于stm32f407vet6;开关频率10k,驱动全桥电路时可起到20khz的效果,对于2022年电赛,需要用到两个全桥拓扑,单极倍频调制方式相较于双极性spwm调制,装置损耗可以得到一定程度的减少。.........

Yii2.0表单提交与后台接收_yii的表单提交怎么接收数据_红尘炼炼心的博客-程序员秘密

一、表单提交格式Yii2.0表单提交具有防csrf措施,所以提交表单时需要拥有格外的字段*post提交 request->csrfToken?>">*get提交 二、后台数据接收*GETYii::$app->request->get($key,$default)【说明】第一个参数(key)为用户get请求的key,第一个参数选填;第二个参数(defaul

优质的游戏-cc协议2d素材库素材推荐,不容错过_2d像素素材_星球羊羊的博客-程序员秘密

关于游戏-cc协议2d素材库素材肯定是很多人需要的东西,但是在找的时候总是会碰到各种问题,小编为大家总结了很多种类齐全,免费好用的素材,赶紧围观!接下来就给大家介绍一下我珍藏已久的网站,我的工作灵感都是来源它哦,里面的游戏-cc协议2d素材库资源数量多,种类丰富,并且每隔一个月都会更新一次资源,可以说是非常宝藏了!为大家整理了2d素材-游戏-cc协议2d素材库合集为了方便大家更快的找到资源,小编给大家指引路线:搜索【爱给网】,进入网站后-点击-游戏-(cc)协议素材库-2d素材栏目,然后再点

springboot回调函数中调用Dao层注入失败空指针问题_userdao注入失败_hello_w_o_r_l_d的博客-程序员秘密

it610首页在线工具课程搜索文章桥豆麻袋丶桥豆麻袋丶发布时间:2020-08-04 17:03Springboot + MQTT 在消息到达回调函数中处理数据库操作触发断线问题解决方法项目实战问题总结MQTT 在消息到达回调函数中处理数据库操作触发断线问题解决方法问题原因(个人理解)解决办法:问题原因(个人理解)在MQtt消息到达回调函数中 不能有一些异常的操作否则都会触掉线比如:我在回调函数中,获取到的数据类型是Float类型,我用Integer类型变量进行比较的时候,它就会触