Android5.0开发范例大全 读书笔记(五)

(四)实现设备硬件交互与媒体交互

4.6自定义摄像头覆盖层

1.将Camera中的内容实时的绘制到SurfaceView中

若要自定义拍摄界面,只要重新定义surface的界面即可

以下展示全部代码

public class PreviewActivity extends AppCompatActivity implements SurfaceHolder.Callback {
    Camera mCamera;
    SurfaceView mPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preview);
        mPreview= (SurfaceView) findViewById(R.id.preview);
        assert mPreview != null;
        mPreview.getHolder().addCallback(this);
        mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mCamera=Camera.open();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mCamera.stopPreview();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCamera.release();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(mPreview.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Camera.Parameters params=mCamera.getParameters();
        List<Camera.Size> sizes=params.getSupportedPreviewSizes();
        Camera.Size selected=sizes.get(0);
        params.setPreviewSize(selected.width,selected.height);
        mCamera.setParameters(params);
        mCamera.setDisplayOrientation(90);
        mCamera.startPreview();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
}

2.改变拍摄方向,调用setDisplayOrientation(90)后,拍摄方向方向才会垂直显示

mCamera.setDisplayOrientation(90);

4.12创建倾斜监听器

1.获取系统的SensorManager服务

mSensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);

2.获取加速度感知器

mAccelerometer=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

3.主方法中的监听,实时改变颜色

    public void onSensorChanged(SensorEvent event) {
        float[] values = event.values;
        float x = values[0] / 10;
        float y = values[1] / 10;
        int scaleFactor;
        if (x > 0) {
            scaleFactor = (int) Math.min(x * 255, 255);
            mRight.setBackgroundColor(Color.TRANSPARENT);
            mLeft.setBackgroundColor(Color.argb(scaleFactor, 255, 0, 0));
        } else {
            scaleFactor = (int) Math.min(Math.abs(x) * 255, 255);
            mRight.setBackgroundColor(Color.argb(scaleFactor, 255, 0, 0));
            mLeft.setBackgroundColor(Color.TRANSPARENT);
        }
        if (y > 0) {
            scaleFactor = (int) Math.min(y * 255, 255);
            mTop.setBackgroundColor(Color.TRANSPARENT);
            mBottom.setBackgroundColor(Color.argb(scaleFactor, 255, 0, 0));
        } else {
            scaleFactor = (int) Math.min(Math.abs(y) * 255, 255);
            mTop.setBackgroundColor(Color.argb(scaleFactor, 255, 0, 0));
            mBottom.setBackgroundColor(Color.TRANSPARENT);
        }
        valueView.setText(String.format("X:%1$1.2f,Y:%2$1.2f,Z:%3$1.2f", values[0], values[1], values[2]));

4.分别在resume和pause中注册和注销

 @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
    }
 @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

5.传感器这块水很深,真要学的话我发现一本书叫《Android传感器高级编程》,哪天想不开了就去看看吧。

(五)数据持久化

5.1制作首选项界面

1.以前这种用户信息或者系统配置的界面都是自己用组件慢慢实现,原来还有个叫PreferenceActivity的东西

2.首先,样式还是通过XML定义,在res下新建目录xml

以下是res/xml/settings.xml的完整代码

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <EditTextPreference
        android:defaultValue="Joshua"
        android:key="namePref"
        android:summary="Tell us your name"
        android:title="Name" />
    <CheckBoxPreference
        android:defaultValue="false"
        android:key="morePref"
        android:title="Enable More Settings" />
    <PreferenceScreen
        android:dependency="morePref"
        android:key="moreScreen"
        android:title="More Settings">
        <ListPreference
            android:defaultValue="GRN"
            android:entries="@array/color_names"
            android:entryValues="@array/color_values"
            android:key="colorPref"
            android:summary="Choose your favorite color"
            android:title="Favorite Color" />

        <PreferenceCategory android:title="LOCATION SETTINGS">
            <CheckBoxPreference
                android:defaultValue="true"
                android:key="gpsPref"
                android:summary="use gps to find you"
                android:title="Use GPS Location" />
            <CheckBoxPreference
                android:defaultValue="true"
                android:key="networkPref"
                android:summary="use NetWork to find you"
                android:title="Use NetWork Location" />

        </PreferenceCategory>
    </PreferenceScreen>
</PreferenceScreen>

3.接着,让当前activity继承PreferenceActivity

public class SettingsActivity extends AppCompatActivity

4.最后,将xml资源与当前activity绑定

addPreferencesFromResource(R.xml.color_setting);

5.此外,还可以加载默认的首选项内容,与SharedPreferences结合起来十分完美

PreferenceManager.setDefaultValues(SettingsActivity.this, R.xml.color_setting, false);
@Override
    protected void onResume() {
        super.onResume();
        SharedPreferences settings=PreferenceManager.getDefaultSharedPreferences(this);
        String name=settings.getString("namePref","");
        boolean isMoreEnabled=settings.getBoolean("morePref",false);
    }

6.不过,PreferenceActivity已经完成了其历史使命,现在Google推荐使用PreferenceFragment

很简单,直接上源码

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        PreferenceManager.setDefaultValues(SettingsActivity.this, R.xml.settings, false);
        getFragmentManager().beginTransaction().replace(R.id.preference, new PrefsFragment()).commit();

    }

    public static class PrefsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.settings);

        }
    }
时间: 2024-12-20 19:00:49

Android5.0开发范例大全 读书笔记(五)的相关文章

Android5.0开发范例大全 读书笔记(六)

(六)与系统交互 6.1后台通知 1.关于后台通知,下面展示6种样式.值得一提的是,笔者的小米5只能显示基本样式,雷军真是良心厂商啊. 2.首先上布局xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="

Android5.0开发范例大全 读书笔记(二)

(二)用户交互  2.1ActionBar 1.首先,调用onCreateOptionsMenu(Menu menu)方法为actionbar设置样式 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.support,menu); return true; } res/menu/support.xml如下 <?xml version="1.0" en

Android5.0开发范例大全 读书笔记(四)

(三)通信和联网 3.1显示Web信息 1.WebView通过loadUrl()方法直接访问网页时,点击跳转链接会打开系统默认的浏览器,若要拦截WebView事件,可为其添加WebViewClient webView.setWebViewClient(new WebViewClient()) 2.WebView默认不支持JavaScript,要通过setJavaScriptEnabled()进行设置 webView.getSettings().setJavaScriptEnabled(true)

Android5.0开发范例大全 读书笔记(三)

(二)用户交互 2.14转发触摸事件 1.TouchDelegate很适合简单的触摸转发,它指定任意的矩形区域来向小视图转发触摸事件,其缺点是每个被转发的事件都会转发到代理视图的中间位置 public class TouchDelegateLayout extends FrameLayout { public TouchDelegateLayout(Context context) { this(context, null); } public TouchDelegateLayout(Conte

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2

技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuery.HTML5.Node.js实例大全-读书笔记1 3.2 照片加载与定位 根据功能设计,可以先写好 HTML 结构基础,再配好 CSS 做出大致效果,最后用 JavaScript加上各种动作.首先请看 HTML 代码结构. 3.2.1 HTML 代码 CSS代码保存到 eg3.css 文件中,Ja

android5.0开发必备版本和JDK环境配置

android5.0开发必备版本: JDK-1.8-x64; NDK-10-x64; ADT-5.0&4.0-x64; 谷歌代理: https://wen.lu/?gfe_rd=cr&ei=Ir7YU5XsOK3J8ge_24GgBQ&gws_rd=cr 也可用FQ软件:goagent,或FQ浏览器 goagent: https://github.com/goagent/goagent 配置地址:http://www.woshipm.com/it/13644.html JDK配置(

《JavaScript设计模式与开发实践》读书笔记之观察者模式

1.<JavaScript设计模式与开发实践>读书笔记之观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. JavaScript中通常采用事件模型替代传统的观察者模式 1.1 逐步实现观察者模式 以客户看房为例 首先指定谁充当发布者,如售楼处 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者.这里为了让订阅者只接收自己感兴趣的消息,增加一个标识key 最后发布消息时候,发布者遍历缓存列表,依次触发里面存放的订阅者的回

《Kinect应用开发实战》读书笔记---干货集合

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45029841 作者:cartzhang 说明:本帖内容同时在GALAXIX的Kinect区发表.<Kinect应用开发实战>读书笔记 此书内容针对SDK版本为1.5版本,跟后来版本之前有微小的差别. <Kinect应用开发实战>读书笔记 对于初学来说,本书很不错,将来挺多的基础和细节. 非常感谢本书作者. 以

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记3

技术非常多,样例非常多.仅仅好慢慢学,慢慢实践!!如今学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuery.HTML5.Node.js实例大全-读书笔记2 3.3 响应鼠标动作 图3-2的效果已经有了,须要鼠标来操作展示想看的照片.这就须要在对应的地方加上事件. 3.3.1 响应小照片单击动作 在3.2.3的代码里提供了显示小图列表的eg.showThumb()方法.在单击小图片时要显示大图片.