16 กุมภาพันธ์ 2556

[Android Code] เรียกใช้งาน Auto Focus ของกล้อง



มาถึงบทความนี้ก็ยังอยู่ที่เรื่องกล้องอีกเช่นเคย
แต่คราวนี้ก็เป็นเรื่องต่อจากเรื่องเก่าเหมือนเดิม
ก็คือการใช้ออโต้โฟกัส (Auto Focus ) กล้อง
เวลาผู้ใช้ใช้งานกล้อง อาจจะมีการโฟกัสแล้วเบลอ
ก็สามารถให้กล้องทำการปรับโฟกัสใหม่ได้


ซึ่งในบทความนี้ขอพูดถึง Auto Focus ก่อนนะ
คือตัวเครื่องจะเลือกโฟกัสให้อัตโนมัติเองเลย
ส่วนเรื่อง Touch เพื่อ Focus เอาไว้บทความหลัง

สำหรับการเรียกใช้งาน Auto Focus ก็ทำงานเป็น Callback
เฉกเช่นเดียวกับพวก Callback ต่างๆของกล้องที่เคยพูดไป
แต่ของ Auto Focus ก็ใช้ Callback เป็น AutoFocusCallback
และจะมีฟังก์ชัน onAutoFocus ที่ทำงานเมื่อมีการ Callback
public void onAutoFocus(boolean success, Camera camera) { ... }
สำหรับฟังก์ชัน onAutoFocus ก็จะมีข้อมูลส่งเข้ามาสองตัว
คือ boolean success เพื่อให้รู้ว่า กล้องโฟกัสภาพได้หรือไม่
ส่วน Camera camera ก็คือคลาส Camera ของกล้องที่ใช้งาน

เวลาเรียกใช้งานก็เหมือนกับตอนใช้คำสั่งถ่ายภาพ
Camera mCamera = Camera.open(); mCamera.autoFocus(AutoFocusCallback cb);
โดยต้องกำหนดให้กับคำสั่ง autoFocus ด้วยว่า
จะให้  AutoFocusCallback ไปทำงานในฟังก์ชันใด
เจ้าของบล็อกก็จะใช้วิธีประกาศ Implement เหมือนเดิม

ก็ไม่มีอะไรมากนักกับ Auto Focus ทีนี้มาดูตัวอย่างเลยดีกว่า

Main.java
package app.akexorcist.camerafocus; import java.util.List; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallback; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; public class Main extends Activity implements SurfaceHolder.Callback , AutoFocusCallback { Camera mCamera; SurfaceView mPreview; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.main); mPreview = (SurfaceView)findViewById(R.id.preview); mPreview.getHolder().addCallback(this); mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mPreview.setOnClickListener(new OnClickListener() { public void onClick(View v) { mCamera.autoFocus(Main.this); } }); } public void onResume() { Log.d("System","onResume"); super.onResume(); mCamera = Camera.open(); } public void onPause() { Log.d("System","onPause"); super.onPause(); mCamera.release(); } public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { Log.d("CameraSystem","surfaceChanged"); Camera.Parameters params = mCamera.getParameters(); List<Camera.Size> previewSize = params.getSupportedPreviewSizes(); List<Camera.Size> pictureSize = params.getSupportedPictureSizes(); params.setPictureSize(pictureSize.get(0).width,pictureSize.get(0).height); params.setPreviewSize(previewSize.get(0).width,previewSize.get(0).height); params.setJpegQuality(100); mCamera.setParameters(params); try { mCamera.setPreviewDisplay(mPreview.getHolder()); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } public void surfaceCreated(SurfaceHolder arg0) { Log.d("CameraSystem","surfaceCreated"); try { mCamera.setPreviewDisplay(mPreview.getHolder()); } catch (Exception e) { e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder arg0) { } public void onAutoFocus(boolean success, Camera camera) { Log.d("CameraSystem","onAutoFocus"); } }

เคยอธิบายบางส่วนไปแล้วใน [Android Code] การติดต่อใช้งานกล้อง
ก็เลยขอย่อคำสั่งเอาแค่เฉพาะคำสั่งที่เพิ่มเข้ามาในบทความนี้

1. ในบทความนี้จะให้กดหน้าจอแล้วทำการ Auto Focus
จึงทำการกำหนด OnClickListener ให้กับ mPreview

2. ใช้คำสั่ง Auto Focus โดยให้ Callback ตามที่ Implement ไว้



3. เป็นฟังก์ชันที่มาจาก Implement ตัว AutoFocusCallback
โดยที่ฟังก์ชันนี้จะใช้คำสั่งอะไรก็ได้ เวลาที่ต้องการให้คำสั่ง
ทำงานเมื่อมีการ Aufo Focus ซึ่งในบทความนี้ไม่ได้ใช้อะไร
แค่กำหนดให้แสดงข้อความขึ้นใน LogCat ว่าฟังก์ชันนี้ทำงาน

ถ้าไม่ต้องการใช้งาน Callback ก็กำหนดค่าเป็น Null ได้เลย
mCamera.autoFocus(null);
ก็จะไม่ต้องกำหนด Callback ให้กับ AutoFocusCallback แล้ว


main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <SurfaceView android:id="@+id/preview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout>


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="app.akexorcist.camerafocus" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" > <activity android:name="Main" android:label="@string/app_name" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

เวลาใช้ทดสอบก็ให้เปิดแอปฯ ขึ้นมาแล้วลองแตะจอดู
กล้องก็จะทำการโฟกัสให้ใหม่ และมีข้อความแสดงใน LogCat

สำหรับผู้ที่หลงเข้ามาอ่านผู้ใดที่ต้องการไฟล์ตัวอย่าง
สามารถดาวน์โหลดได้จาก Camera Focus [Google Drive]



เรื่องราวเก่าๆสำหรับกล้อง กล้อง และกล้อง






เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium