当前位置: 首页 > 编程日记 > 正文

[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

http://blog.csdn.net/candycat1992/article/details/21617741

实现

以OpenCV的JavaCameraView为例,首先需要定制自己的Camera,主要代码如下:
[java] view plaincopy
print?在CODE上查看代码片派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import org.opencv.android.JavaCameraView;  
  4. import android.R.integer;  
  5. import android.content.Context;  
  6. import android.graphics.Rect;  
  7. import android.graphics.RectF;  
  8. import android.hardware.Camera;  
  9. import android.hardware.Camera.AutoFocusCallback;  
  10. import android.util.AttributeSet;  
  11. import android.view.MotionEvent;  
  12. import android.widget.Toast;  
  13. public class MTCameraView extends JavaCameraView implements AutoFocusCallback {  
  14. public MTCameraView(Context context, int attrs) {  
  15. super(context, attrs);  
  16. // TODO Auto-generated constructor stub  
  17. }
  18. public List<Camera.Size> getResolutionList() {        
  19. return  mCamera.getParameters().getSupportedPreviewSizes();        
  20. }
  21. public Camera.Size getResolution() {  
  22. Camera.Parameters params = mCamera.getParameters();
  23. Camera.Size s = params.getPreviewSize();
  24. return s;  
  25. }
  26. public void setResolution(Camera.Size resolution) {  
  27. disconnectCamera();
  28. connectCamera((int)resolution.width, (int)resolution.height);         
  29. }
  30. public void focusOnTouch(MotionEvent event) {  
  31. Rect focusRect = calculateTapArea(event.getRawX(), event.getRawY(), 1f);
  32. Rect meteringRect = calculateTapArea(event.getRawX(), event.getRawY(), 1.5f);  
  33. Camera.Parameters parameters = mCamera.getParameters();
  34. parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
  35. if (parameters.getMaxNumFocusAreas() > 0) {  
  36. List<Camera.Area> focusAreas = new ArrayList<Camera.Area>();  
  37. focusAreas.add(new Camera.Area(focusRect, 1000));  
  38. parameters.setFocusAreas(focusAreas);
  39. }
  40. if (parameters.getMaxNumMeteringAreas() > 0) {  
  41. List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();  
  42. meteringAreas.add(new Camera.Area(meteringRect, 1000));  
  43. parameters.setMeteringAreas(meteringAreas);
  44. }
  45. mCamera.setParameters(parameters);
  46. mCamera.autoFocus(this);  
  47. }
  48. /** 
  49.      * Convert touch position x:y to {@link Camera.Area} position -1000:-1000 to 1000:1000. 
  50.      */  
  51. private Rect calculateTapArea(float x, float y, float coefficient) {  
  52. float focusAreaSize = 300;  
  53. int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();  
  54. int centerX = (int) (x / getResolution().width * 2000 - 1000);  
  55. int centerY = (int) (y / getResolution().height * 2000 - 1000);  
  56. int left = clamp(centerX - areaSize / 2, -1000, 1000);  
  57. int right = clamp(left + areaSize, -1000, 1000);  
  58. int top = clamp(centerY - areaSize / 2, -1000, 1000);  
  59. int bottom = clamp(top + areaSize, -1000, 1000);  
  60. return new Rect(left, top, right, bottom);  
  61. }
  62. private int clamp(int x, int min, int max) {  
  63. if (x > max) {  
  64. return max;  
  65. }
  66. if (x < min) {  
  67. return min;  
  68. }
  69. return x;  
  70. }
  71. public void setFocusMode (Context item, int type){  
  72. Camera.Parameters params = mCamera.getParameters();
  73. List<String> FocusModes = params.getSupportedFocusModes();
  74. switch (type){  
  75. case 0:  
  76. if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))  
  77. params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
  78. else   
  79. Toast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();  
  80. break;  
  81. case 1:           
  82. if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))  
  83. params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
  84. else  
  85. Toast.makeText(item, "Continuous Mode not supported", Toast.LENGTH_SHORT).show();  
  86. break;  
  87. case 2:           
  88. if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF))  
  89. params.setFocusMode(Camera.Parameters.FOCUS_MODE_EDOF);
  90. else  
  91. Toast.makeText(item, "EDOF Mode not supported", Toast.LENGTH_SHORT).show();  
  92. break;  
  93. case 3:  
  94. if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED))  
  95. params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);
  96. else  
  97. Toast.makeText(item, "Fixed Mode not supported", Toast.LENGTH_SHORT).show();  
  98. break;  
  99. case 4:  
  100. if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY))  
  101. params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
  102. else  
  103. Toast.makeText(item, "Infinity Mode not supported", Toast.LENGTH_SHORT).show();  
  104. break;  
  105. case 5:  
  106. if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))  
  107. params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
  108. else  
  109. Toast.makeText(item, "Macro Mode not supported", Toast.LENGTH_SHORT).show();  
  110. break;        
  111. }
  112. mCamera.setParameters(params);
  113. }
  114. public void setFlashMode (Context item, int type){  
  115. Camera.Parameters params = mCamera.getParameters();
  116. List<String> FlashModes = params.getSupportedFlashModes();
  117. switch (type){  
  118. case 0:  
  119. if (FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))  
  120. params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
  121. else  
  122. Toast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();  
  123. break;  
  124. case 1:  
  125. if (FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))  
  126. params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
  127. else  
  128. Toast.makeText(item, "Off Mode not supported", Toast.LENGTH_SHORT).show();            
  129. break;  
  130. case 2:  
  131. if (FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))  
  132. params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
  133. else  
  134. Toast.makeText(item, "On Mode not supported", Toast.LENGTH_SHORT).show();         
  135. break;  
  136. case 3:  
  137. if (FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))  
  138. params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);
  139. else  
  140. Toast.makeText(item, "Red Eye Mode not supported", Toast.LENGTH_SHORT).show();            
  141. break;  
  142. case 4:  
  143. if (FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))  
  144. params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
  145. else  
  146. Toast.makeText(item, "Torch Mode not supported", Toast.LENGTH_SHORT).show();          
  147. break;  
  148. }
  149. mCamera.setParameters(params);
  150. }
  151. @Override  
  152. public void onAutoFocus(boolean arg0, Camera arg1) {  
  153. }
  154. }

在MainActivity中需要初始化MTCamera,并且实现OnTouchListener接口,以便在触摸屏幕时可以调用onTouch函数。其中主要代码如下:
[java] view plaincopy
print?在CODE上查看代码片派生到我的代码片
  1. private MTCameraView mOpenCvCameraView;  
  2. public void init() {  
  3. mOpenCvCameraView = new MTCameraView(this, -1);  
  4. mOpenCvCameraView.setCvCameraViewListener(this);  
  5. mOpenCvCameraView.setFocusable(true);  
  6. mOpenCvCameraView.setOnTouchListener(MainActivity.this);  
  7. mOpenCvCameraView.enableView();
  8. FrameLayout frame = new FrameLayout(this);  
  9. frame.addView(mOpenCvCameraView);
  10. setContentView(frame);
  11. }
  12. @Override  
  13. public boolean onTouch(View arg0, MotionEvent arg1) {  
  14. // TODO Auto-generated method stub  
  15. mOpenCvCameraView.focusOnTouch(arg1);
  16. return true;  
  17. }

init()函数是自定义的初始化函数,可以在onCreate时使用。由于这里需要使用OpenCV库,所以本项目是在加载完OpenCV库并判断成功后才调用init()函数的。

解释

在发生触摸事件时,MainActivity由于实现了OnTouchListener接口,因此会调用重写的onTouch函数,并把它的第二个参数MotionEvent传递给MTCamera,以便定位触摸位置。
MTCamera的focusOnTouch函数继续工作。它首先根据触摸位置计算对焦和测光(metering)区域的大小(通过calculateTapArea函数),然后创建新的Camera.Parameters,并设置摄像机的对焦模式为Auto。
然后,它分别判断该设备的相机是否支持设置对焦区域和测光区域,如果支持就分别为parameters设置之前计算好的聚焦和测光区域。
最后,让Camera自动对焦。
  • calculateTapArea函数

    这个函数主要实现从屏幕坐标系到对焦坐标系的转换。由MotionEvent.getRowX()得到的是以屏幕坐标系(即屏幕左上角为原点,右下角为你的当前屏幕分辨率,单位是一个像素)为准的坐标,而setFocusAreas接受的List<Area>中的每一个Area的范围是(-1000,-1000)到(1000, 1000),也就是说屏幕中心为原点,左上角为(-1000,-1000),右下角为(1000,1000)。注意,如果超出这个范围的话,会报setParemeters failed的错误哦!除此之外,我们还提前定义了一个对焦框(测光框)的大小,并且接受一个参数(第三个参数coefficient)作为百分比进行调节。


至此完成了触摸对焦的功能。
但是,可以发现MTCamera里还有很大部分代码,主要是两个函数setFocusMode和setFlashMode。这两个函数,主要是因为在项目中我的图像经常是模糊的,但不知道系统支持那么对焦模式。这时,就可以使用这两个函数进行测试。这还需要在MainActivity中添加菜单栏的代码,以便进行选择。代码如下:
[java] view plaincopy
print?在CODE上查看代码片派生到我的代码片
  1. private List<Camera.Size> mResolutionList;  
  2. private MenuItem[] mResolutionMenuItems;  
  3. private MenuItem[] mFocusListItems;  
  4. private MenuItem[] mFlashListItems;  
  5. private SubMenu mResolutionMenu;  
  6. private SubMenu mFocusMenu;  
  7. private SubMenu mFlashMenu;  
  8. @Override  
  9. public boolean onCreateOptionsMenu(Menu menu) {  
  10. Log.i(TAG, "called onCreateOptionsMenu");  
  11. List<String> mFocusList = new LinkedList<String>();  
  12. int idx =0;  
  13. mFocusMenu = menu.addSubMenu("Focus");  
  14. mFocusList.add("Auto");  
  15. mFocusList.add("Continuous Video");  
  16. mFocusList.add("EDOF");  
  17. mFocusList.add("Fixed");  
  18. mFocusList.add("Infinity");  
  19. mFocusList.add("Makro");  
  20. mFocusList.add("Continuous Picture");  
  21. mFocusListItems = new MenuItem[mFocusList.size()];  
  22. ListIterator<String> FocusItr = mFocusList.listIterator();
  23. while(FocusItr.hasNext()){  
  24. // add the element to the mDetectorMenu submenu  
  25. String element = FocusItr.next();
  26. mFocusListItems[idx] = mFocusMenu.add(2,idx,Menu.NONE,element);  
  27. idx++;
  28. }
  29. List<String> mFlashList = new LinkedList<String>();  
  30. idx = 0;  
  31. mFlashMenu = menu.addSubMenu("Flash");  
  32. mFlashList.add("Auto");  
  33. mFlashList.add("Off");  
  34. mFlashList.add("On");  
  35. mFlashList.add("Red-Eye");  
  36. mFlashList.add("Torch");  
  37. mFlashListItems = new MenuItem[mFlashList.size()];  
  38. ListIterator<String> FlashItr = mFlashList.listIterator();
  39. while(FlashItr.hasNext()){  
  40. // add the element to the mDetectorMenu submenu  
  41. String element = FlashItr.next();
  42. mFlashListItems[idx] = mFlashMenu.add(3,idx,Menu.NONE,element);  
  43. idx++;
  44. }
  45. mResolutionMenu = menu.addSubMenu("Resolution");  
  46. mResolutionList = mOpenCvCameraView.getResolutionList();
  47. mResolutionMenuItems = new MenuItem[mResolutionList.size()];  
  48. ListIterator<Camera.Size> resolutionItr = mResolutionList.listIterator();
  49. idx = 0;  
  50. while(resolutionItr.hasNext()) {  
  51. Camera.Size element = resolutionItr.next();
  52. mResolutionMenuItems[idx] = mResolutionMenu.add(1, idx, Menu.NONE,  
  53. Integer.valueOf((int) element.width).toString() + "x" + Integer.valueOf((int) element.height).toString());  
  54. idx++;
  55. }
  56. return true;  
  57. }
  58. public boolean onOptionsItemSelected(MenuItem item) {  
  59. Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);  
  60. if (item.getGroupId() == 1)  
  61. {
  62. int id = item.getItemId();  
  63. Camera.Size resolution = mResolutionList.get(id);
  64. mOpenCvCameraView.setResolution(resolution);
  65. resolution = mOpenCvCameraView.getResolution();
  66. String caption = Integer.valueOf((int) resolution.width).toString() + "x" + Integer.valueOf((int) resolution.height).toString();  
  67. Toast.makeText(this, caption, Toast.LENGTH_SHORT).show();  
  68. }
  69. else if (item.getGroupId()==2){  
  70. int focusType = item.getItemId();  
  71. mOpenCvCameraView.setFocusMode(this, focusType);  
  72. }
  73. else if (item.getGroupId()==3){  
  74. int flashType = item.getItemId();  
  75. mOpenCvCameraView.setFlashMode(this, flashType);  
  76. }
  77. return true;  
  78. }

这样运行后,点击菜单就可以看见有三个菜篮列表:Focus(对焦模式),Flash(视频模式),Resolution(支持的分辨率)。对焦模式和视频模式中提供了几种常见的模式供选择,代码会判断当前设备是否支持该模式。而分辨率菜单栏会显示出当前设备支持的所有分辨率种类。

参考

  • StackOverFlow上关于触摸对焦的讨论
  • Android多媒体和相机讲解十
  • 解读Android 4.0 Camera原生应用程序的设计思路
  • OpenCV上的提问:ANDROID: Use autofocus with CameraBridgeViewBase?

转载于:https://www.cnblogs.com/jukan/p/6857881.html

相关文章:

create-react-app my-app 报错解决方法

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 第一个原因&#xff1a;可能是没安装镜像&#xff0c; 解决方法&#xff1a; $ npm install -g cnpm --registryhttps://registry.npm.taobao.org 第二个原因&#xff1a; 报错日志&#xff1a; h…

越南一难倒博士的趣味数学题

越南有一道难倒博士的趣味数学题&#xff0c;见下图&#xff1a; 在空格中填入1...9&#xff0c;可以重复&#xff0c;求使等式成立的一个组合 我吐槽一下&#xff0c;这题在NOIP中肯定算水题了&#xff0c;爆搜都能过。O(9n),n9 我就不具体代码实现了。 据说有人跟我一样的想…

学习使用React和Electron一次构建自己的桌面聊天应用程序

by Alex Booker通过亚历克斯布克 学习使用React和Electron一次构建自己的桌面聊天应用程序 (Learn to build your own desktop chat app with React and Electron, one step at a time) This tutorial was written in collaboration with the awesome Christian Nwamba.本教程…

数据库删除,存储

布局主要分两个 其中主布局是 <?xml version"1.0" encoding"utf-8"?> <EditText android:id"id/yf_input" android:layout_width"wrap_content" android:layout_height"wrap_content" android:hint"" …

【Ant Design Pro 一】 环境搭建,创建一个demo

技术交流qq群 173683895 搭建 Ant Design Pro 的前期准备&#xff1a;你的本地环境需要安装 cnpm、node。 注&#xff1a;代码块中的 $ 代表&#xff1a; $后面是在命令行输入的命令&#xff0c;举例 $ npm start 解&#xff1a;实际上是应该打开命令行输入 npm start 下…

JOptionPane

JOptionPane类 1、属于javax.swing 包。 2、功能&#xff1a;定制四种不同种类的标准对话框。 ConfirmDialog 确认对话框。提出问题&#xff0c;然后由用户自己来确认&#xff08;按"Yes"或"No"按钮&#xff09; InputDialog 提示输入文本 MessageDialog …

react 错误边界_React with GraphQL和错误边界中的自定义错误页面

react 错误边界by Abi Noda通过Abi Noda React with GraphQL和错误边界中的自定义错误页面 (Custom error pages in React with GraphQL and Error Boundaries) If you like this article please support me by checking out Pull Reminders, a Slack bot that sends your tea…

UITextField 限制用户输入小数点后位数的方法

UITextField 限制用户输入小数点后位数的方法 位数限制: limited 在UITextField的代理方法中添加类似如下代码 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {NSMutableString * futureStr…

[BZOJ 1002] [FJOI 2007] 轮状病毒

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3045 Solved: 1687[Submit][Status][Discuss]Description 给定n(N<100)&#xff0c;编程计算有多少个不同的n轮状病毒。 Input 第一行有1个正整数n。 Output 将编程计算出的不同的n轮状病毒数输出…

微信小程序左上角返回按钮跳转到指定页面

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 在当前页面的 onUnload 执行页面跳转 onUnload: function () {wx.reLaunch({url: ../logs/logs})}, 代码讲解&#xff1a;监听页面卸载的函数&#xff0c;把页面重定向到指定的 页面&#xff1b;

过度沉思_从沉思到演出:我如何开始我的自由职业

过度沉思by Ashley MacWhirter作者&#xff1a;Ashley MacWhirter 从沉思到演出&#xff1a;我如何开始我的自由职业 (From grit to gigs: how I started my freelancing business) In less than one year, I went from a Georgia Tech Coding Bootcamp graduate to a busines…

拾人牙慧篇之———QQ微信的第三方登录实现

一、写在前面 关于qq微信登录的原理之流我就不一一赘述了&#xff0c;对应的官网都有&#xff0c;在这里主要是展示我是怎么实现出来的&#xff0c;看了好几个博客&#xff0c;有的是直接复制官网的&#xff0c;有的不知道为什么实现不了。我只能保证我的这个是我实现后才贴出来…

win7旗舰版下配置IIS服务器

选择上述的插件后&#xff0c;Windows 需要更新一段时间&#xff0c;并重启电脑 测试是否安装成功&#xff1a;http://localhost 注意&#xff1a;默认端口号是 80&#xff0c;不能和tomcat 的 80 端口同时重启 常见问题&#xff1a; 1.默认页面或者新添加的网站一直出现…

微信小程序 加载中 动画效果

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 效果图&#xff1a; 代码&#xff1a; <view class"line"><image src"../../img/line.png"></image></view>.line {height:1px;position:absolute;animat…

java开放源码_开放源码的第一周:我是如何参与的,以及我学到的东西

java开放源码by Chak Shun Yu泽顺宇 开放源码的第一周&#xff1a;我是如何参与的&#xff0c;以及我学到的东西 (My first week of open source: how I got involved, and what I’ve learned) When I started to write this post, I had finished my first serious week of …

几个不错的开源的.net界面控件

转自原文 几个不错的开源的.net界面控件 (转) 几个不错的开源的.net界面控件 - zt 介绍几个自己觉得不错的几个开源的.net界面控件&#xff0c;不知道是否有人介绍过。 DockPanel Suite&#xff1a;开发类似VS.NET的界面&#xff0c;#Develop就是使用的这个控件。 网址&#…

CSS 盒子模型(转)

CSS中&#xff0c; Box Model叫盒子模型&#xff08;或框模型&#xff09;&#xff0c;Box Model规定了元素框处理元素内容&#xff08;element content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09; 和 外边距&#xff08;margin…

React 入门笔记 1

React的核心&#xff1a;JSX 首先&#xff0c;React 的页面就是js文件&#xff0c;看到这会有朋友疑惑了&#xff0c;js怎么写标签组件&#xff1f; 解&#xff1a;首先&#xff0c;我们需要了解JSX&#xff0c;什么是JSX&#xff1f; JSX就是JavaScript XML。一种在React组件…

自学成才翁_如何发挥自学成才的内在游戏

自学成才翁by Victor Cassone由Victor Cassone 如何发挥自学成才的内在游戏 (How to play the inner game of self-taught development) Teaching yourself software development is hard. Anyone who tells you otherwise most likely hasn’t done it before.自学软件开发非…

C语言回溯算法解决N皇后问题

回溯算法的模型是 x, not satisfy ? x-- : continue. 代码中x作列号&#xff0c;y[x]保存第x列上皇后放置的位置。 1 #include<stdio.h>2 #include<math.h>3 #define N 54 int position_check(int,int*);5 void print_board(int count,int* y);6 int main()7 {8 …

React 创建组件 使用组件 2

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 组件&#xff1a; 通过组件&#xff0c;可以将UI拆分成独立的&#xff0c;可重复使用的部分&#xff0c;从概念上讲&#xff0c;组件就像javaScript函数&#xff0c;它们接受任意输入&#xff08;称之为…

如何征服Webpack 4并构建一个出色的React应用

This article has been outdated with the new release for babel, kindly check the updated article “How to combine Webpack 4 and Babel 7 to create a fantastic React app”, last updated October 13th, 2018本文与babel的新版本已经过时&#xff0c;请查看更新的文章…

React State和生命周期 3

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 一&#xff1a;组件的生命周期 组件的生命周期可分成三个状态&#xff1a; 安装&#xff1a;已插入真实DOM更新&#xff1a;正在被重新渲染卸载&#xff1a;已移出真实DOM 生命周期的方法有&#xff1a…

TCP/IP 笔记 1.3 IP:网际协议

---恢复内容开始--- I P是T C P / I P协议族中最为核心的协议。所有的 T C P、U D P、I C M P及I G M P数据都以I P数据报格式传输。  不可靠( u n r e l i a b l e)的意思是它不能保证 I P数据报能成功地到达目的地。 I P仅提供最好的传输服务。如果发生某种错误时&#xff…

keras bi-lstm_LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels

keras bi-lstmby Megan Risdal梅根里斯达尔(Megan Risdal) LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels (An applied introduction to LSTMs for text generation — using Keras and GPU-enabled Kaggle Kernels) Kaggle recently gave data scientists …

201521123013 《Java程序设计》第13周学习总结

1. 本周学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn&#xff0c;分析返回结果有何不同&#xff1f;为什么会有这样的不同&#xff1f; ping值不同&#xff08;time列&#xff09;&#xff0c;cec.jmu.edu.cn的ping值比较小。ping值&am…

React 事件 4

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 将参数传递给事件处理程序 在循环内部&#xff0c;通常需要将额外的参数传递给事件处理程序。例如&#xff0c;如果id是行ID&#xff0c;则以下任何一个都可以工作&#xff1a; <button onClick{(e…

border-radius

周知&#xff1a;OPPO R819T Android 4.2.1和红米某些机型上&#xff0c;webview中&#xff0c;如果一个元素定义了 border border-radius&#xff0c;这时如果该元素有背景&#xff0c;那么背景将会溢出圆角之外&#xff0c;Yo新增了一个方法来fix这个问题&#xff0c;大家之…

javascript调试_如何提高JavaScript调试技能

javascript调试Almost all software developers who have written even a few lines of code for the Web have had at least a quick glance at JavaScript. After all, it is currently one of the most in-demand programming languages.几乎所有甚至为Web编写了几行代码的软…

Java transient

原文出自&#xff1a;http://www.importnew.com/21517.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口&#xff0c;这个对象就可以被序列化&#xff0c;java的这种序列化模式为开发者提供了很多便利&#xff0c;我们可以不必关系具体序列化的…