近期做项目需要添加上传短视频功能,功能设置为类似于微信,点击开始拍摄,设置最长拍摄时间,经过研究最终实现了这个功能,下面就和大家分享一下,希望对你有帮助。

1.视频录制自定义控件:

  1. /**
  2. * 视频播放控件
  3. */
  4. public class MovieRecorderView extends LinearLayout implements OnErrorListener {
  5.  
  6. private SurfaceView mSurfaceView;
  7. private SurfaceHolder mSurfaceHolder;
  8. private ProgressBar mProgressBar;
  9.  
  10. private MediaRecorder mMediaRecorder;
  11. private Camera mCamera;
  12. private Timer mTimer;// 计时器
  13. private OnRecordFinishListener mOnRecordFinishListener;// 录制完成回调接口
  14.  
  15. private int mWidth;// 视频分辨率宽度
  16. private int mHeight;// 视频分辨率高度
  17. private boolean isOpenCamera;// 是否一开始就打开摄像头
  18. private int mRecordMaxTime;// 一次拍摄最长时间
  19. private int mTimeCount;// 时间计数
  20. private File mVecordFile = null;// 文件
  21.  
  22. public MovieRecorderView(Context context) {
  23. this(context, null);
  24. }
  25.  
  26. public MovieRecorderView(Context context, AttributeSet attrs) {
  27. this(context, attrs, 0);
  28. }
  29.  
  30. @SuppressLint("NewApi")
  31. public MovieRecorderView(Context context, AttributeSet attrs, int defStyle) {
  32. super(context, attrs, defStyle);
  33.  
  34. TypedArray a = context.obtainStyledAttributes(attrs,
  35. R.styleable.MovieRecorderView, defStyle, 0);
  36. mWidth = a.getInteger(R.styleable.MovieRecorderView_width, 320);// 默认320
  37. mHeight = a.getInteger(R.styleable.MovieRecorderView_height, 240);// 默认240
  38.  
  39. isOpenCamera = a.getBoolean(
  40. R.styleable.MovieRecorderView_is_open_camera, true);// 默认打开
  41. mRecordMaxTime = a.getInteger(
  42. R.styleable.MovieRecorderView_record_max_time, 10);// 默认为10
  43.  
  44. LayoutInflater.from(context)
  45. .inflate(R.layout.movie_recorder_view, this);
  46. mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
  47. mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
  48. mProgressBar.setMax(mRecordMaxTime);// 设置进度条最大量
  49.  
  50. mSurfaceHolder = mSurfaceView.getHolder();
  51. mSurfaceHolder.addCallback(new CustomCallBack());
  52. mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  53.  
  54. a.recycle();
  55. }
  56.  
  57. /**
  58. *
  59. */
  60. private class CustomCallBack implements Callback {
  61.  
  62. @Override
  63. public void surfaceCreated(SurfaceHolder holder) {
  64. if (!isOpenCamera)
  65. return;
  66. try {
  67. initCamera();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72.  
  73. @Override
  74. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  75. int height) {
  76.  
  77. }
  78.  
  79. @Override
  80. public void surfaceDestroyed(SurfaceHolder holder) {
  81. if (!isOpenCamera)
  82. return;
  83. freeCameraResource();
  84. }
  85.  
  86. }
  87.  
  88. /**
  89. * 初始化摄像头
  90. */
  91. private void initCamera() throws IOException {
  92. if (mCamera != null) {
  93. freeCameraResource();
  94. }
  95. try {
  96. mCamera = Camera.open();
  97. } catch (Exception e) {
  98. e.printStackTrace();
  99. freeCameraResource();
  100. }
  101. if (mCamera == null)
  102. return;
  103.  
  104. setCameraParams();
  105. mCamera.setDisplayOrientation(90);
  106. mCamera.setPreviewDisplay(mSurfaceHolder);
  107. mCamera.startPreview();
  108. mCamera.unlock();
  109. }
  110.  
  111. /**
  112. * 设置摄像头为竖屏
  113. */
  114. private void setCameraParams() {
  115. if (mCamera != null) {
  116. Parameters params = mCamera.getParameters();
  117. params.set("orientation", "portrait");
  118. mCamera.setParameters(params);
  119. }
  120. }
  121.  
  122. /**
  123. * 释放摄像头资源
  124. */
  125. private void freeCameraResource() {
  126. if (mCamera != null) {
  127. mCamera.setPreviewCallback(null);
  128. mCamera.stopPreview();
  129. mCamera.lock();
  130. mCamera.release();
  131. mCamera = null;
  132. }
  133. }
  134.  
  135. private void createRecordDir() {
  136. //录制的视频保存文件夹
  137. File sampleDir = new File(Environment.getExternalStorageDirectory()
  138. + File.separator + "ysb/video/");//录制视频的保存地址
  139. if (!sampleDir.exists()) {
  140. sampleDir.mkdirs();
  141. }
  142. File vecordDir = sampleDir;
  143. // 创建文件
  144. try {
  145. mVecordFile = File.createTempFile("recording", ".mp4", vecordDir);// mp4格式的录制的视频文件
  146. } catch (IOException e) {
  147. e.printStackTrace();
  148. }
  149. }
  150.  
  151. /**
  152. * 初始化
  153. * @throws IOException
  154. */
  155. @SuppressLint("NewApi")
  156. private void initRecord() throws IOException {
  157. mMediaRecorder = new MediaRecorder();
  158. mMediaRecorder.reset();
  159. if (mCamera != null)
  160. mMediaRecorder.setCamera(mCamera);
  161. mMediaRecorder.setOnErrorListener(this);
  162. mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
  163. mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 视频源
  164. mMediaRecorder.setAudioSource(AudioSource.MIC);// 音频源
  165. mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
  166. mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音频格式
  167. mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:
  168. // mMediaRecorder.setVideoFrameRate(16);// 这个我把它去掉了,感觉没什么用
  169. mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 1024 * 100);// 设置帧频率,然后就清晰了
  170. mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制
  171. mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 视频录制格式
  172. // mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
  173. mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());
  174. mMediaRecorder.prepare();
  175. try {
  176. mMediaRecorder.start();
  177. } catch (IllegalStateException e) {
  178. e.printStackTrace();
  179. } catch (RuntimeException e) {
  180. e.printStackTrace();
  181. } catch (Exception e) {
  182. e.printStackTrace();
  183. }
  184. }
  185.  
  186. /**
  187. * 开始录制视频
  188. * @param fileName
  189. * 视频储存位置
  190. * @param onRecordFinishListener
  191. * 达到指定时间之后回调接口
  192. */
  193. public void record(final OnRecordFinishListener onRecordFinishListener) {
  194. this.mOnRecordFinishListener = onRecordFinishListener;
  195. createRecordDir();
  196. try {
  197. if (!isOpenCamera)// 如果未打开摄像头,则打开
  198. initCamera();
  199. initRecord();
  200. mTimeCount = 0;// 时间计数器重新赋值
  201. mTimer = new Timer();
  202. mTimer.schedule(new TimerTask() {
  203.  
  204. @Override
  205. public void run() {
  206. mTimeCount++;
  207. mProgressBar.setProgress(mTimeCount);// 设置进度条
  208. if (mTimeCount == mRecordMaxTime) {// 达到指定时间,停止拍摄
  209. stop();
  210. if (mOnRecordFinishListener != null)
  211. mOnRecordFinishListener.onRecordFinish();
  212. }
  213. }
  214. }, 0, 1000);
  215. } catch (IOException e) {
  216. e.printStackTrace();
  217. }
  218. }
  219.  
  220. /**
  221. * 停止拍摄
  222. */
  223. public void stop() {
  224. stopRecord();
  225. releaseRecord();
  226. freeCameraResource();
  227. }
  228.  
  229. /**
  230. * 停止录制
  231. */
  232. public void stopRecord() {
  233. mProgressBar.setProgress(0);
  234. if (mTimer != null)
  235. mTimer.cancel();
  236. if (mMediaRecorder != null) {
  237. // 设置后不会崩
  238. mMediaRecorder.setOnErrorListener(null);
  239. mMediaRecorder.setPreviewDisplay(null);
  240. try {
  241. mMediaRecorder.stop();
  242. } catch (IllegalStateException e) {
  243. e.printStackTrace();
  244. } catch (RuntimeException e) {
  245. e.printStackTrace();
  246. } catch (Exception e) {
  247. e.printStackTrace();
  248. }
  249. }
  250. }
  251.  
  252. /**
  253. * 释放资源
  254. */
  255. private void releaseRecord() {
  256. if (mMediaRecorder != null) {
  257. mMediaRecorder.setOnErrorListener(null);
  258. try {
  259. mMediaRecorder.release();
  260. } catch (IllegalStateException e) {
  261. e.printStackTrace();
  262. } catch (Exception e) {
  263. e.printStackTrace();
  264. }
  265. }
  266. mMediaRecorder = null;
  267. }
  268.  
  269. public int getTimeCount() {
  270. return mTimeCount;
  271. }
  272.  
  273. //返回录制的视频文件
  274. public File getmVecordFile() {
  275. return mVecordFile;
  276. }
  277.  
  278. /**
  279. * 录制完成回调接口
  280. */
  281. public interface OnRecordFinishListener {
  282. public void onRecordFinish();
  283. }
  284.  
  285. @Override
  286. public void onError(MediaRecorder mr, int what, int extra) {
  287. try {
  288. if (mr != null)
  289. mr.reset();
  290. } catch (IllegalStateException e) {
  291. e.printStackTrace();
  292. } catch (Exception e) {
  293. e.printStackTrace();
  294. }
  295. }
  296. }

2.视频录制界面文件movie_recorder_view.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="@android:color/background_dark"
  7. android:orientation="vertical">
  8.  
  9. <SurfaceView
  10. android:id="@+id/surfaceview"
  11. android:layout_width="fill_parent"
  12. android:layout_height="0dp"
  13. android:layout_weight="1"
  14. />
  15.  
  16. <ProgressBar
  17. android:id="@+id/progressBar"
  18. style="?android:attr/progressBarStyleHorizontal"
  19. android:layout_width="match_parent"
  20. android:layout_height="2dp"
  21. />
  22.  
  23. </LinearLayout>

做好这些准备工作,下面我们就可以开始设计我们的视频录制功能了。PS:以上代码取至网上,在此向大牛致敬。

3.拍摄主界面,拍摄界面有两部分组成,上面是视频拍摄控件显示,下面是用户点击拍摄按钮,配置文件:activity_main.xml。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="@android:color/white"
  7. android:orientation="vertical">
  8.  
  9. <com.example.wechatvideorecorddemo.MovieRecorderView
  10. android:id="@+id/movieRecorderView"
  11. android:layout_width="match_parent"
  12. android:layout_height="0dp"
  13. android:layout_weight="1"
  14. android:layout_margin="3dp" />
  15.  
  16. <Button
  17. android:id="@+id/shoot_button"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:layout_gravity="center"
  21. android:background="@drawable/bg_movie_add_shoot"
  22. android:text="按住拍"
  23. android:textColor="#20b6ff"/>
  24.  
  25. </LinearLayout>

4.有了主界面的视图,下面我们就开始书写我们的Activity文件MainActivity.java:

  1. public class MainActivity extends Activity {
  2.  
  3. private MovieRecorderView mRecorderView;//视频录制控件
  4. private Button mShootBtn;//视频开始录制按钮
  5. private boolean isFinish = true;
  6. private boolean success = false;//防止录制完成后出现多次跳转事件
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. mRecorderView = (MovieRecorderView) findViewById(R.id.movieRecorderView);
  13. mShootBtn = (Button) findViewById(R.id.shoot_button);
  14.  
  15. //用户长按事件监听
  16. mShootBtn.setOnTouchListener(new OnTouchListener() {
  17.  
  18. @Override
  19. public boolean onTouch(View v, MotionEvent event) {
  20. if (event.getAction() == MotionEvent.ACTION_DOWN) {//用户按下拍摄按钮
  21. mShootBtn.setBackgroundResource(R.drawable.bg_movie_add_shoot_select);
  22. mRecorderView.record(new OnRecordFinishListener() {
  23.  
  24. @Override
  25. public void onRecordFinish() {
  26. if(!success&&mRecorderView.getTimeCount()<10){//判断用户按下时间是否大于10秒
  27. success = true;
  28. handler.sendEmptyMessage(1);
  29. }
  30. }
  31. });
  32. } else if (event.getAction() == MotionEvent.ACTION_UP) {//用户抬起拍摄按钮
  33. mShootBtn.setBackgroundResource(R.drawable.bg_movie_add_shoot);
  34. if (mRecorderView.getTimeCount() > 3){//判断用户按下时间是否大于3秒
  35. if(!success){
  36. success = true;
  37. handler.sendEmptyMessage(1);
  38. }
  39. } else {
  40. success = false;
  41. if (mRecorderView.getmVecordFile() != null)
  42. mRecorderView.getmVecordFile().delete();//删除录制的过短视频
  43. mRecorderView.stop();//停止录制
  44. Toast.makeText(MainActivity.this, "视频录制时间太短", Toast.LENGTH_SHORT).show();
  45. }
  46. }
  47. return true;
  48. }
  49. });
  50. }
  51.  
  52. @Override
  53. public void onResume() {
  54. super.onResume();
  55. isFinish = true;
  56. if (mRecorderView.getmVecordFile() != null)
  57. mRecorderView.getmVecordFile().delete();//视频使用后删除
  58. }
  59.  
  60. @Override
  61. public void onSaveInstanceState(Bundle outState) {
  62. super.onSaveInstanceState(outState);
  63. isFinish = false;
  64. success = false;
  65. mRecorderView.stop();//停止录制
  66. }
  67.  
  68. @Override
  69. public void onPause() {
  70. super.onPause();
  71. }
  72.  
  73. @Override
  74. public void onDestroy() {
  75. super.onDestroy();
  76. }
  77.  
  78. private Handler handler = new Handler() {
  79. @Override
  80. public void handleMessage(Message msg) {
  81. if(success){
  82. finishActivity();
  83. }
  84. }
  85. };
  86.  
  87. //视频录制结束后,跳转的函数
  88. private void finishActivity() {
  89. if (isFinish) {
  90. mRecorderView.stop();
  91. Intent intent = new Intent(this, SuccessActivity.class);
  92. Bundle bundle = new Bundle();
  93. bundle.putString("text", mRecorderView.getmVecordFile().toString());
  94. intent.putExtras(bundle);
  95. startActivity(intent);
  96. }
  97. success = false;
  98. }
  99.  
  100. /**
  101. * 录制完成回调
  102. */
  103. public interface OnShootCompletionListener {
  104. public void OnShootSuccess(String path, int second);
  105. public void OnShootFailure();
  106. }
  107. }

到这里我们仿微信的短视频拍摄就已经大功告成,那么下面我们检验一下,我们录制的效果如何,下面我以Android提供的视频播放控件(VideoView)为大家介绍一下如何播放录制的短视频。

5.播放视频的配置文件activity_success.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="@android:color/white"
  7. android:orientation="vertical">
  8.  
  9. <TextView
  10. android:id="@+id/text"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_gravity="center"
  14. android:text="@string/app_name" />
  15. <LinearLayout
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:orientation="horizontal"
  19. >
  20. <Button
  21. android:id="@+id/button1"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:layout_weight="1"
  25. android:gravity="center"
  26. android:padding="5dp"
  27. android:text="播放"
  28. />
  29. <Button
  30. android:id="@+id/button2"
  31. android:layout_width="match_parent"
  32. android:layout_height="wrap_content"
  33. android:layout_weight="1"
  34. android:gravity="center"
  35. android:padding="5dp"
  36. android:text="暂停"
  37. />
  38. <Button
  39. android:id="@+id/button3"
  40. android:layout_width="match_parent"
  41. android:layout_height="wrap_content"
  42. android:layout_weight="1"
  43. android:gravity="center"
  44. android:padding="5dp"
  45. android:text="重播"
  46. />
  47. <Button
  48. android:id="@+id/button4"
  49. android:layout_width="match_parent"
  50. android:layout_height="wrap_content"
  51. android:layout_weight="1"
  52. android:gravity="center"
  53. android:padding="5dp"
  54. android:text="视频长度"
  55. />
  56. </LinearLayout>
  57. <VideoView
  58. android:id="@+id/videoView1"
  59. android:layout_width="wrap_content"
  60. android:layout_height="500dp" />
  61.  
  62. </LinearLayout>

6.视频播放的控制代码SuccessActivity.java:

  1. public class SuccessActivity extends Activity implements OnClickListener{
  2.  
  3. private TextView text;//视频保存的路径
  4. private Button button1;//播放开关
  5. private Button button2;//暂停开关
  6. private Button button3;//重新播放开关
  7. private Button button4;//视频大小开关
  8. private VideoView videoView1;//视频播放控件
  9. private String file;//视频路径
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_success);
  15. Bundle bundle = getIntent().getExtras();
  16. file = bundle.getString("text");//获得拍摄的短视频保存地址
  17. init();
  18. setValue();
  19. }
  20.  
  21. //初始化
  22. private void init() {
  23. text = (TextView) findViewById(R.id.text);
  24. button1 = (Button) findViewById(R.id.button1);
  25. button2 = (Button) findViewById(R.id.button2);
  26. button3 = (Button) findViewById(R.id.button3);
  27. button4 = (Button) findViewById(R.id.button4);
  28. videoView1 = (VideoView) findViewById(R.id.videoView1);
  29. }
  30.  
  31. //设置
  32. private void setValue() {
  33. text.setText(file);
  34. button1.setOnClickListener(this);
  35. button2.setOnClickListener(this);
  36. button3.setOnClickListener(this);
  37. button4.setOnClickListener(this);
  38. videoView1.setVideoPath(file);
  39. }
  40.  
  41. @Override
  42. public void onClick(View v) {
  43. switch (v.getId()) {
  44. case R.id.button1:
  45. videoView1.start();
  46. break;
  47.  
  48. case R.id.button2:
  49. videoView1.pause();
  50. break;
  51.  
  52. case R.id.button3:
  53. videoView1.resume();
  54. videoView1.start();
  55. break;
  56.  
  57. case R.id.button4:
  58. Toast.makeText(this, "视频长度:"+(videoView1.getDuration()/1024)+"M", Toast.LENGTH_SHORT).show();
  59. break;
  60.  
  61. default:
  62. break;
  63. }
  64. }
  65.  
  66. }

7.添加权限:

  1. <!-- 视频录制的权限star -->
  2. <!-- 摄像头 -->
  3. <uses-permission android:name="android.permission.CAMERA" />
  4. <!-- 音频即声音 -->
  5. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  6. <!-- sd卡写入权限 -->
  7. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  8. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  9. <!-- 硬件支持 -->
  10. <uses-feature android:name="android.hardware.camera" />
  11. <uses-feature android:name="android.hardware.camera.autofocus" />
  12. <!-- 视频录制的权限end -->

功能界面截图:

  

  

好了,到这里关于拍摄短视频的知识就和大家分享完毕,具体的实现很简单,相信大家看到这里已经已经学会了,当然如果你还有什么疑问,可以留言讨论。最后给大家分享一个demo的下载地址,方便大家下载学习,下载地址:http://pan.baidu.com/s/1hqts0pm

Android仿微信拍摄短视频的更多相关文章

  1. Android 仿微信小视频录制

    Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章

  2. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  3. android多框架实现短视频应用、3D手势旋转、banner控件、指南针、智能管家等应用源码

    Android精选源码 android智能管家app源码 Android高仿拼多多分类列表 Android百度地图实例详解之仿摩拜单车APP RecyclerView的LayoutManager搭建流 ...

  4. Android仿微信界面

    效果图 原理介绍 1.先绘制一个颜色(例如:粉红) 2.设置Mode=DST_IN 3.绘制我们这个可爱的小机器人 回答我,显示什么,是不是显示交集,交集是什么?交集是我们的小机器人的非透明区域,也就 ...

  5. android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

    Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...

  6. Android仿微信高效压缩图片(libjpeg)

    用过ios手机的同学应该很明显感觉到,ios拍照1M的图片要比安卓拍照排出来的5M的图片还要清晰.这是为什么呢? 这得了解android底层是如何对图片进行处理的. 当时谷歌开发Android的时候, ...

  7. Android 仿微信朋友圈添加图片

    github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...

  8. Android 仿微信朋友圈发动态功能(相册图片多选)

    代码分享 代码名称: 仿微信朋友圈发动态功能(相册图片多选) 代码描述: 仿微信朋友圈发动态功能(相册图片多选) 代码托管地址: http://www.apkbus.com/android-15276 ...

  9. Android 仿微信朋友圈拍小视频上传到服务器

    这个接上一个写的实现拍小视频和传到服务器的  界面是这个样子滴. 我也知不知道怎么给图片搞小一点o(╯□╰)o 布局文件是这样的[认真脸] <?xml version="1.0&quo ...

随机推荐

  1. [BZOJ1127][POI2008] KUP子矩阵

    Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...

  2. display:table-cell

    布局神器display:table-cell Author:owenhong2015-06-17 随着时间的推进,ie6.ie7在中国浏览器市场的占有率越来越低的情况,我现在工作的团队,经过用户访问数 ...

  3. Mac系统中配置Tomcat环境

    第一步:下载Tomcat 下载地址:http://tomcat.apache.org/download-80.cgi 直接下载如图选中的即可 第二步: 下载完成后,解压,随意放入目录.如我就把它放在/ ...

  4. ajax+div 代替iframe 学习尝试

    工作的时候遇到了所谓html内多tab展示的情况,主要是通过iframe来关联子页面: 不过也不知道从何时开始记得是说iframe不建议多用,所以想想,还是找找有没有其他方法(不应用于工作): 先说下 ...

  5. MLlib决策树与集成树

    决策树是一种常见的分类与回归机器学习算法,由于其模型表达性好,便于理解,并能取得较好的效果,而受到广泛的应用.下图是一个简单的决策树,决策树每个非叶子节点包含一个条件,对于具有连续值的特征,该条件为一 ...

  6. matlab环境配置

    一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录\atlas_At ...

  7. java-String Date Calendar之间的转换

    1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...

  8. 关于pl/sql数据库下拉中选项为空的问题

    1.可能是在配置环境变量TNS_ADMIN的时候后面多了一个分号,去掉分号就可以了

  9. sql编程篇 (五) 事务

    计算机中的事务 编辑 概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用 ...

  10. xamarin 学习

    http://www.cnblogs.com/lonelyxmas/p/5174934.html http://www.cnblogs.com/phytan/p/xamarincrack2.html ...