IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 创新实训项目——第八篇进你那侧tang yi tang -> 正文阅读

[移动开发]创新实训项目——第八篇进你那侧tang yi tang

2021SC@SDUSC


前言

上几篇文章已经分析完了飞花令的项目,从这一篇开始分析camera的项目。开发人员的设计中,以手机相机为依托的camera项目不仅需要有基础的拍照功能,并且还需要对拍摄的照?进??系列处理,包括但不仅限于图?抗扭曲,曝光度,聚焦等。具体可以整理为以下功能:
1. 相机预览功能
2. 拍照的偏好设置,如闪光灯,聚焦,曝光补偿
3. 相机可随设备旋转,拍摄横屏和竖屏的照?
4. 拍照后保存在?机的pictures?件夹
5. 可以预览拍摄的照?
6. 图?抗扭曲处理
这篇将继续分析相机的偏好设置和拍照的功能。

一、项目环境

android studio版本 4.1.2

sdk版本 Compile SDK version:30

Build Tools Version 30.0.3

gradle版本 6.8.3

二、代码分析

条目value变化时立即应用设置

用户调整偏好设置之后,SettingsFragment需要监听条目value变化,给SettingsFragment添加监听事件,一旦出现变化,就根据其key立即应用新的value到相机。


public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    switch (key) {//key中存储变化的偏好设置
        case KEY_PREF_FOCUS_MODE:
            setFocusMode(sharedPreferences.getString(key, ""));
            break;
        case KEY_PREF_FLASH_MODE:
            setFlashMode(sharedPreferences.getString(key, ""));
            break;
      case KEY_PREF_EXPOS_COMP:
            setExposComp(sharedPreferences.getString(key, ""));
            break;
    }
    mCamera.stopPreview();
    mCamera.setParameters(mParameters);
    mCamera.startPreview();
}

onSharedPreferenceChanged()为监听事件回调。onResume()和onPause()是Android推荐写法,防止由于Fragment的不断调用导致事件监听失效。
onResume():onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
onPause():onPause()意味着你的activity仍然处于部分可见的状态,但正在进入其他的activity,当时大多数时候,那意味着用户正在离开这个activity并马上会进入Stopped state. Activity必需离开Activity栈的栈顶
onStop():当你的activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源。一旦你的activity停止了,系统会在不再需要这个activity时摧毁它的实例。在极端情况下,系统会直接杀死你的app进程,并且不执行activity的onDestroy()回调方法, 因此你需要使用onStop()来释放资源,从而避免内存泄漏。
onDestory(): onDestory()作用是在一个Activity对象被销毁之前,Android系统会调用该方法,用于释放此Activity之前所占用的资源。
三种调用的场景:
一个Activity启动另一个Activity: onPause()->onStop(),再返回:onRestart()->onStart()->onResume()
程序按back 退出: onPause()->onStop()->onDestory(),再进入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),再进入:onRestart()->onStart()->onResume();

设置菜单中显示ListPreference的当前值

PreferenceGroup是直接继承于Preference,起到的是一个容器作用,他的子类有 PreferenceCategory 和PreferenceScreen,这两个直接继承PreferenceGroup所以在开发中起的作用也是容器,用于”安置“其他子Preference的容器。

如果pref时PreferenceGroup的实例,那pref中将pref强转为PreferenceGroup类,利用PreferenceGroup中的getPreference()方法获取到容器内Preference的数量,并且利用getPreference来得到参数,这是一个嵌套函数,如果已经得到了具体的函数,就调用updateSummary方法, 利用getEntry()方法用于在指定参数的帮助下获取此实例的 参数值。

private static void initSummary(Preference pref) {
    if (pref instanceof PreferenceGroup) {
        PreferenceGroup prefGroup = (PreferenceGroup) pref;
        for (int i = 0; i < prefGroup.getPreferenceCount(); i++) {
            initSummary(prefGroup.getPreference(i));
        }
    } else {
        updatePrefSummary(pref);
    }
}
private static void updatePrefSummary(Preference pref) {
    if (pref instanceof ListPreference) {
        pref.setSummary(((ListPreference) pref).getEntry());
    }
}
 

以下是界面效果:在这里插入图片描述

在这里插入图片描述

照片文件命名:生成文件名

文件名首先标记文件类型,然后是时间,如IMG_20160503_153218.jpg,在CameraPreview中添加:

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
private Uri outputMediaFileUri;
private String outputMediaFileType ="0";

external storage就是SD卡,利用了Environment.getExternalStoragePubicDirectory( Environment.DIRECTORY_PICTURES)获得到文件存储目录,用以进一步存储照片,getExternalStoragePubicDirectory()是一个更加方便的访问Android给我们提供好的一些公共目录的方法
File.separator 的作用相当于 ’ \ ',起到一个分隔符的作用,用于指定新文件的路径
URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是每一种可用的资源,如 图像、视频片段、程序等都由一个URI进行标识的。

private File getOutputMediaFile(int type) {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), TAG);
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(TAG, "failed to create directory");
                return null;
            }//创建目录,失败返回false
        }
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());//获取当前时间,并且定义格式
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "IMG_" + timeStamp + ".jpg");
            outputMediaFileType = "image/*";
        } else if (type == MEDIA_TYPE_VIDEO) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "VID_" + timeStamp + ".mp4");
            outputMediaFileType = "video/*";
        } else {
            return null;
        }
        outputMediaFileUri = Uri.fromFile(mediaFile);
        return mediaFile;
    }
public Uri getOutputMediaFileUri() {
    return outputMediaFileUri;
}
public String getOutputMediaFileType() {
    return outputMediaFileType;
}

三、总结

这次分析完成了相机预览和偏好设置的代码,并且开始了关于拍照处理的代码,首先分析了关于拍照片文件命名和存储的代码,下一篇将开始分析如何实现拍照

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:24:56  更:2021-11-28 11:25:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:56:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码