Android图片上倒计时,Android自定义照相机倒计时拍照
自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件:
两个TextView是用来显示提示信息和倒计时的秒数的
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#266194"
android:orientation="vertical"
tools:context=".TestActivity" >
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical" >
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请调整位置到此区域"
android:textColor="#ff0000"
android:textSize="32sp" />
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:gravity="center_horizontal"
android:textColor="#266194"
android:textSize="32sp" />
接下来是mainActivity中的具体实现以及详细注释:
package com.dhsr.pujiejia.ui;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import com.example.pujiejiaapp.R;
@SuppressLint({ "NewApi", "SdCardPath" })
public class CameraActivity extends Activity implements Runnable {
// 预览图片范围
private SurfaceView surfaceView;
private TextView tv_time;
// 倒计时拍摄
private int cameratime = 4;
private Camera camera;
private boolean preview = false;
// 文件名字
private String filename;
// 文件名字的带的时间戳
private String timeString;
// 格式化时间
private SimpleDateFormat dateFormat;
// 日期对象
private Date date;
// 控制线程
boolean stopThread = false;
private File file;
String photo;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
int what = msg.what;
switch (what) {
case 222:
tv_time.setText("" + cameratime);
if ("0".equals(tv_time.getText().toString())) {
tv_time.setText("拍摄成功!");
takePhoto();
}
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
CameraActivity.this.setFinishOnTouchOutside(false);
// 初始化数据
findView();
surfaceView.getHolder().addCallback(new SufaceListener());
/* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setFixedSize(200, 200); // 设置分辨率
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
// 开启线程
new Thread(this).start();
}
private final class SufaceListener implements SurfaceHolder.Callback {
/**
* surface改变
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
/**
* surface创建
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
// 调用系统的前置摄像头
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
camera = Camera.open(i);
}
}
Camera.Parameters parameters = camera.getParameters();
/* 每秒从摄像头捕获5帧画面, */
parameters.setPreviewFrameRate(5);
/* 设置照片的输出格式:jpg */
parameters.setPictureFormat(PixelFormat.JPEG);
/* 照片质量 */
parameters.set("jpeg-quality", 85);
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());// 通过SurfaceView显示取景画面
camera.startPreview();
preview = true;
} catch (Exception e) {
}
}
/**
* surface销毁
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
if (preview)
camera.stopPreview();
camera.release();
camera = null;
}
}
}
/**
* 拍摄照片
*/
private void takePhoto() {
// 执行拍照效果
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
timeString = formatDate();
//保存到data/data目录自定义文件夹下
filename = "/data/data/com.example.pujiejiaapp/images/"
+ timeString + ".jpg";
File file = new File(filename);
boolean createNewFile = file.createNewFile()
System.out.println("创建文件夹成功没有" + createNewFile);
System.out.println(file);
FileOutputStream outStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);
outStream.flush();
outStream.close();
// 重新浏览
camera.stopPreview();
camera.startPreview();
preview = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
});
}
@Override
public void run() {
while (!stopThread) {
try {
//按秒数倒计时
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cameratime--;
mHandler.sendEmptyMessage(222);
if (cameratime <= 0) {
break;
}
}
}
// 初始化数据
private void findView() {
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
tv_time = (TextView) findViewById(R.id.tv_time);
}
// 格式化系统的时间
public String formatDate() {
date = new Date(System.currentTimeMillis());
// 日期格式
dateFormat = new SimpleDateFormat("'IMG'_yyyyMMddHHmmss");
return dateFormat.format(date);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
// 线程已关闭
super.onDestroy();
stopThread = true;
}
}
核心代码详解:
1.创建SurfaceView时,surfaceCreated()方法中
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
// 调用系统的前置摄像头
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
camera = Camera.open(i);
}
}
此部分代码为打开相机时默认打开前置摄像头CameraInfo.CAMERA_FACING_BACK为默认打开后置摄像头,CameraInfo.CAMERA_FACING_FRONT前置摄像头
2.照片拍摄takePhoto()方法中:
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
timeString = formatDate();
filename = "/data/data/com.example.pujiejiaapp/images/"
+ timeString + ".jpg";
photo = timeString + ".jpg";
File file = new File(filename);
boolean createNewFile = file.createNewFile();
FileOutputStream outStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);
此部分代码为将拍摄到的图片保存为以bitmap格式保存在指定的目录下
3.开子线程用于倒计时拍摄
public void run() {
while (!stopThread) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cameratime--;
mHandler.sendEmptyMessage(222);
if (cameratime <= 0) {
break;
}
}
}
希望大家理解核心代码的详细注释,欢迎提供意见,希望能给大家带来帮助,谢谢!
Android图片上倒计时,Android自定义照相机倒计时拍照相关推荐
- php android 图片上传,android上传图片到PHP的过程详解
这篇文章主要介绍了android上传图片到PHP的过程详解,需要的朋友可以参考下 今天在做上传头像的时候,总是提交连接超时错误,报错信息如下:XXXXXXSokcetTimeOutXXXXXXXX 然 ...
- 强烈推荐:Android史上最强大的自定义任务软件Tasker
强烈推荐:Android史上最强大的自定义任务软件Tasker http://bbs.mumayi.com/thread-28387-1-1.html (出处: 木蚂蚁手机乐园) Android上的T ...
- 图片上传压缩android,android 图片上传压缩常见问题分析
图片的上传与压缩是android经常需要用到的步骤,那么,如何解决上传图片oom问题呢?android 图片上传压缩常见问题分析,希望可以帮助大家更加的了解android 图片方面的困惑. 下面,是我 ...
- android倒计时dialog,自定义带倒计时的Dialog
1.[文件] CustomDiaglog.rar ~ 56KB 下载(206) 2.[图片] 豌豆荚截图20121103224745.png 3.[代码]Dialog核心代码 package ...
- android 自定义图片上传,android自定义ImageView仿图片上传示例
看下效果图 主要看下自定义view 代码 public class ProcessImageView extends ImageView{ private Context context; priva ...
- android 自定义图片上传,android自定义ImageView仿图片上传(示例代码)
Activity代码 1 public classMainActivity extends AppCompatActivity {2 ProcessImageView processImage ...
- android 图片预览动画,Android图片上传实现预览效果
首先具体分析一下,实现的功能,其中需求分析是必不可少的,需求.逻辑清除之后,再上手写代码,思路会很清晰. 1.多图上传首先得选择图片(这里项目需求是既可以拍照上传也可以从相册中选择) 2.拍照上传很简 ...
- Android图片上传(头像裁切+原图原样)
还是那句话,最近项目比较忙拖了很久这篇文章终于完成了! 先看一下效果图: (一)头像裁切.上传服务器(效果图) 一般都是有圆形显示头像的,这里我自定义了一个ImageView,页面很干净但是看着很上档 ...
- Android自定义照相机实现 拍照 录像
文档中的Camera 要使用Camera,首先我们先看一下文档(http://androiddoc.qiniudn.com/reference/android/hardware/Camera.html ...
最新文章
- python 速度矢量_最近邻搜索4D空间python快速-矢量化
- 如何在SAP云平台上使用MongoDB服务
- 详细介绍springData
- 超详细的CentOS7中安装Git,yum安装和自己编译安装
- Android之WebView学习
- numpy存储特征:消耗内存和计算速度测试
- Oracle : 使用JDBC连接ORACLE的三种URL格式
- Java基础学习总结(136)——有关流资源关闭(try-with-resources与AutoCloseable)的使用总结
- 湖州机器人上课时间_【倒计时5天】燃到炸!湖州吾悦广场10月30日开业狂欢指南,请收下...
- 机器学习/深度学习测试题(一) —— 单层感知器的激活函数
- 机器学习基石PLA相关
- 学习嵌入式和单片机有没有必要,价值体现在哪
- jQuery - 添加元素
- python 处理xls遇到的坑
- 华为杯2020-2021年数学建模大赛题目分享
- php输出excel乱码,如何解决php导出excel乱码的问题
- 短信服务器和运营商的区别,什么是短信服务商?与短信运营商的区别
- WEB-互补色与对比色的计算与获取 (实用、赞)
- UVa 10066 - The Twin Towers
- linux下qt打印功能如何实现,Qt Graphics-View的打印功能实现
热门文章
- .NET团队送给.NET开发人员的云原生学习资源
- Asp.Net Core之Identity应用(下篇)
- GraphQL:面对复杂类型
- .NET与鲲鹏共展翅,昇腾九万里(二)
- Asp.Net Core下的开源任务调度平台ScheduleMaster
- 提升Azure App Service的几个建议
- 程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
- .NET Core 3.0稳定版发布
- 微软发布新的 Azure Pipelines 功能和集成
- 大部分Intel hardware intrinsic 将在 .NET Core 2.1 中启用