本课时介绍超级手电筒的程序架构以及热点区域的布局。
先写架构:图片布局的架构和程序的架构
第一程序的架构:
就是我要知道,我的程序是怎样的一种架构,什么样的代码放在怎样的地方。让写的代码易于扩张,易于重构,已于重用。
这个用于写一些通用的方法,让他的子类复用,该类中的方法和变量
第一步:BaseActivity extends Activity:
public class BaseActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
第二步:FlashLight extends BaseActivity:
public class FlashLight extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
第三步:MainActivity extends FlashLight:
public class MainActivity extends FlashLight {
}
总结:通过上面的extends,能达到一种链表的构架。由此看出链表并不是一个具体的事物,而是一种抽象的东西。只要符合,链式的这种的结构,我们都可以称之为链表。能把这种概念抽象到一定的高度,并且符合一切能符合的事物,便是一种智慧。这几个类以extends的形式进行联系。他们都是activity,在方法调用的时候,自顶向下的调用的顺序,依次调用activity的onCreate,但是activity的生命周期的方法不一定是按一定的顺序(可以写一写extends相联系的activity,测试一下),这个用到在深究。
第二UI的架构:ui_flashlight.xml
第一层:开和关状态的图片(两张图片)
因为这两张图片必须是相互切换的,为了达到这种效果,就放在一个xml文件中。
drawable:由此看出在这个资源中,不仅可以放置一些xml文件,实现一些特定的效果。
flashlight.xml:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 默认显示第一个图片 -->
<item android:drawable="@drawable/off" />
<item android:drawable="@drawable/on" />
</transition>
ui_flashlight.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/framelayout_flashlight"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 将两个开和关状态的图片放在能相互切换的transition的标签中
之后以imageview的标签引入
-->
<ImageView
android:id="@+id/imageview_flashlight"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/flashlight"
/>
</FrameLayout>
第二层:热区(透明的)
<!-- 这个放置热区,整体叠加存放 -->
<ImageView
android:id="@+id/imageview_controller"
android:layout_width="80dp"
android:layout_height="490dp"
android:layout_gravity="bottom|center_horizontal"
android:onClick="onClick_flashlight"
/>
总的布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/framelayout_flashlight"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 将两个开和关状态的图片放在能相互切换的transition的标签中
之后以imageview的标签引入
-->
<ImageView
android:id="@+id/imageview_flashlight"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/flashlight"
/>
<!-- 这个放置热区,整体叠加存放 -->
<ImageView
android:id="@+id/imageview_controller"
android:layout_width="80dp"
android:layout_height="490dp"
android:layout_gravity="bottom|center_horizontal"
android:onClick="onClick_flashlight"
/>
</FrameLayout>
activity_main.xml:
在这个总的布局,将ui_flashlight.xml引入即可
<!-- 将表示手电筒开关的两张图片引入进来 -->
<include layout="@layout/ui_flashlight"/>
基类代码:
BaseActivity extends Activity:
package com.example.mylight;
import android.app.Activity;
import android.hardware.Camera;
注意这个是导入的这个
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.widget.ImageView;
public class BaseActivity extends Activity{
//protected的属性 让子类使用
//开和关状态的图片
protected ImageView mImageViewFlashlight;
//热区
protected ImageView mImageViewFlashlightController;
//用于开通闪光灯的
protected Camera mCamera;
protected Parameters mParameters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageViewFlashlight=(ImageView) findViewById(R.id.imageview_flashlight);
mImageViewFlashlightController=(ImageView) findViewById(R.id.imageview_controller);
}
}
FlashLight extends BaseActivity:
知识的缺失:是有关闪光灯的开启和关闭
package com.example.mylight;
import android.graphics.Point;
import android.graphics.SurfaceTexture;
import android.graphics.drawable.TransitionDrawable;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
public class FlashLight extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImageViewFlashlight.setTag(false);
Point point=new Point();
//获得屏幕的尺寸
getWindowManager().getDefaultDisplay().getSize(point);
LayoutParams layoutParams=(LayoutParams) mImageViewFlashlightController.getLayoutParams();
layoutParams.height=point.y*3/4;
layoutParams.width=point.x/3;
mImageViewFlashlightController.setLayoutParams(layoutParams);
}
//onClick_flashlight为他设置单击事件
public void onClick_flashlight(View view){
// if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)){
// Toast.makeText(this,"该设备有闪光灯", Toast.LENGTH_LONG).show();
// return;
// }
if((Boolean) mImageViewFlashlight.getTag()==false){
openFlashlight();
}
else{
CloseFlashLight();
}
}
//打开闪光灯
protected void openFlashlight(){
//先得到存放开关图片的,那两个文件。
TransitionDrawable drawable=(TransitionDrawable) mImageViewFlashlight.getDrawable();
//经过一个时间就进行图片的切换。
drawable.startTransition(200);
//tag标志,标志闪光灯的开关
mImageViewFlashlight.setTag(true);
try {
//打开摄像头,闪光灯和摄像头是一体的。
mCamera=Camera.open();
//为mCamera设置一些属性
int textureId=0;
mCamera.setPreviewTexture(new SurfaceTexture(textureId));
mCamera.startPreview();
mParameters=mCamera.getParameters();
mParameters.setFlashMode(mParameters.FLASH_MODE_TORCH);
mCamera.setParameters(mParameters);
} catch (Exception e) {
// TODO: handle exception
}
}
//关闭闪光灯
public void CloseFlashLight(){
TransitionDrawable drawable=(TransitionDrawable) mImageViewFlashlight.getDrawable();
if((Boolean) mImageViewFlashlight.getTag()){
//图片的切换
drawable.reverseTransition(200);
mImageViewFlashlight.setTag(false);
if(mCamera!=null){
mParameters=mCamera.getParameters();
mParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(mParameters);
mCamera.stopPreview();
//释放资源
mCamera.release();
mCamera=null;
}
}
}
//当退出这个程序,关闭闪光灯
@Override
protected void onPause() {
super.onPause();
CloseFlashLight();
}
}