android 基础知识 五

时间:2020-12-21 15:32:48
Android中View的实时刷新
做一个界面时,想在用户触摸屏幕之后先绘图一下,待逻辑处理完毕,再绘制最后的图,查看View的重绘方法,得知是invalidate()函数,于是在代码中这么写道:

  1. public class PuzzleView extends View {
  2.     @Override
  3.     protected void onDraw(Canvas canvas) {
  4.         //...
  5.     }
  6.   
  7.     @Override
  8.     public boolean onTouchEvent(MotionEvent event) {
  9.         invalidate();
  10.         //处理逻辑
  11.         invalidate();
  12.     }
  13. }
复制代码
运行后发现只有第二次invalidate做了,第一次打酱油去了,于是查找资料,看到Invalidate()的描述是这样的:当调用线程处于空闲状态时,会调用onDraw,刷新界面,也就是说,该函数仅是标记当前界面过期,并不直接负责刷新界面,奶奶的,不刷。。。继续翻啊翻,看到SurfaceView能实现 实时刷新,代码结构如下:

  1. public class PuzzleView extends SurfaceView implements SurfaceHolder.Callback{
  2.     private SurfaceHolder surfaceHolder;
  3.   
  4.     public PuzzleView(Context context){
  5.         //....
  6.         surfaceHolder = this.getHolder();//获取holder
  7.         surfaceHolder.addCallback(this);
  8.     }
  9.   
  10.     protected void paint(Canvas canvas) {
  11.         //这里的代码跟继承View时OnDraw中一样
  12.     }
  13.   
  14.     public void repaint() {
  15.         Canvas c = null;
  16.         try {
  17.             c = surfaceHolder.lockCanvas();
  18.             paint(c);
  19.         }
  20.         finally {
  21.             if (c != null) {
  22.                 surfaceHolder.unlockCanvasAndPost(c);
  23.             }
  24.         }  
  25.     }  
  26. }
复制代码
这样写好之后,只要在以前调用invalidate()的地方调用repaint()就可以实现 Android View实时刷新了。

Android从路径中提取文件名Android路径提取文件名,有许多种方法,下面介绍两种比较好的方法。
方法一: 利用String类

  1. public String getFileName(String pathandname){
  2.     int start=pathandname.lastIndexOf("/");
  3.     int end=pathandname.lastIndexOf(".");
  4.     if (start!=-1 && end!=-1) {
  5.         return pathandname.substring(start+1, end);  
  6.     }
  7.     else {
  8.         return null;
  9.     }
  10. }
复制代码
方法二: 利用正则表达式

  1. String regEx = ".+\\\\(.+)$";
  2. String str = "C:\\test.txt";
  3. Pattern p = Pattern.compile(regEx);
  4. Matcher m = p.matcher(str);
  5. boolean rs = m.find();
  6. if (rs) {
  7.     for(int i=1; i<=m.groupCount(); i++) {
  8.         System.out.println(m.group(i)); //括号内匹配内容
  9.     }
  10. }
复制代码
Android一些实用的函数
1:获得屏幕的密度,用于屏幕适配

  1. public static float getDensity(Context ctx) {
  2.     DisplayMetrics metrics = new DisplayMetrics();
  3.     WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
  4.     wm.getDefaultDisplay().getMetrics(metrics);
  5.     return metrics.density;
  6. }
复制代码
2: 获得版本的名字

  1. public static String getVersionName(Context context, String packageName) {
  2.     PackageInfo pInfo = null;
  3.     String rs = "";
  4.     try {
  5.         pInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_META_DATA);
  6.         rs = pInfo.versionName;
  7.     }
  8.     catch (Exception e) {
  9.         e.printStackTrace();     
  10.     }
  11.     return rs;
  12. }
复制代码
3: 获得图片的倒影,同时倒影渐变效果

  1. public static Bitmap createMirro(Bitmap srcbitmap) {
  2.   
  3.     int width = srcbitmap.getWidth();
  4.     int height = srcbitmap.getHeight();
  5.     int shadow_height = 15;
  6.     int[] pixels = new int[width * height];
  7.     srcbitmap.getPixels(pixels, 0, width, 0, 0, width, height);
  8.   
  9.     // shadow effect
  10.     int alpha = 0x00000000;
  11.     for (int y = 0; y < height; y++) {
  12.         for (int x = 0; x < width; x++) {
  13.             int index = y * width + x;
  14.             int r = (pixels[index] >> 16) & 0xff;
  15.             int g = (pixels[index] >> 8) & 0xff;
  16.             int b = pixels[index] & 0xff;
  17.             pixels[index] = alpha | (r << 16) | (g << 8) | b;
  18.         }
  19.         if (y >= (height - shadow_height)) {
  20.             alpha = alpha + 0x1F000000;
  21.         }
  22.     }
  23.       
  24.     // invert effect
  25.     Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  26.     for (int y = 0; y < height; y++) {
  27.         bm.setPixels(pixels, y * width, width, 0, height - y - 1, width, 1);
  28.     }
  29.     return Bitmap.createBitmap(bm, 0, 0, width, shadow_height);
  30. }