編輯:關於Android編程
package com.apress.proandroidmedia.ch2.timersnapshot; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import android.app.Activity; import android.content.ContentValues; import android.content.res.Configuration; import android.hardware.Camera; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.MediaStore.Images.Media; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class TimerSnapShot extends Activity implements OnClickListener, SurfaceHolder.Callback, Camera.PictureCallback { SurfaceView cameraView; SurfaceHolder surfaceHolder; Camera camera;這個 activity 非常類似我們的 SnapShot activity。我們打算添加一個 Button 來觸發的倒計時, 和一個 TextView 來顯示倒計時。
Button startButton; TextView countdownTextView;我們還需要一個 Handler,本例中名為 timerUpdateHandler,一個布爾量(timerRunning),幫助我們記錄是否啟動了計時器,還有一個整數(currentTime),記錄倒計時讀數。
Handler timerUpdateHandler; boolean timerRunning = false; int currentTime = 10; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); cameraView = (SurfaceView)this.findViewById(R.id.CameraView); surfaceHolder = cameraView.getHolder(); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceHolder.addCallback(this);下一步,我們將取得新UI元素(在布局XML中定義)的引用,並使我們的 activity 成為 Button 的 OnClickListener。我們可以這樣做,是因為我們的 activity 實現了 OnClickListener。
countdownTextView = (TextView) findViewById(R.id.CountDownTextView); startButton = (Button) findViewById(R.id.CountDownButton); startButton.setOnClickListener(this);最後,在我們onCreate方法中, 要做的是實例化Handler對象。
timerUpdateHandler = new Handler(); }我們的onClick方法在按下startButton按鈕時被調用。我們會檢查timerRunning,看定時器例程是否已經運行,如果沒有,我們通過Handler對象timerUpdateHandler,非延遲調用 Runnable timerUpdateTask。
public void onClick(View v) { if (!timerRunning) { timerRunning = true; timerUpdateHandler.post(timerUpdateTask); } }這是我們的 Runnable 對象 timerUpdateTask。它包含run方法,由我們的timerUpdateHandler對象觸發。
private Runnable timerUpdateTask = new Runnable() { public void run() {如果記錄倒計時計數的整數currentTime大於1,則遞減之,並讓Handler在1秒後再度調用本Runnable。
if (currentTime > 1) { currentTime--; timerUpdateHandler.postDelayed(timerUpdateTask, 1000); } else {如果currentTime不大於1,我們將讓相機進行拍照並重置所有的記錄變量。
camera.takePicture(null,null ,TimerSnapShot.this); timerRunning = false; currentTime = 10; }不管結果如何,我們將更新 TextView 來顯示當前的剩余時間。
countdownTextView.setText(""+currentTime); } };本 activity 的其余部分,與前述的SnapShot示例基本一樣。
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { camera.startPreview(); } public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); try { camera.setPreviewDisplay(holder); Camera.Parameters parameters = camera.getParameters(); if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { parameters.set("orientation", "portrait"); // Android 2.2 及以上版本 camera.setDisplayOrientation(90); // Android 2.0 及以上版本 parameters.setRotation(90); } camera.setParameters(parameters); } catch (IOException exception) { camera.release(); } } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); } public void onPictureTaken(byte[] data, Camera camera) { Uri imageFileUri = getContentResolver() .insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); try { OutputStream imageFileOS = getContentResolver() .openOutputStream(imageFileUri); imageFileOS.write(data); imageFileOS.flush(); imageFileOS.close(); Toast t = Toast.makeText(this,"Saved JPEG!",Toast.LENGTH_SHORT); t.show(); } catch (FileNotFoundException e) { Toast t = Toast.makeText(this,e.getMessage(), Toast.LENGTH_SHORT); t.show(); } catch (IOException e) { Toast t = Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT); t.show(); } camera.startPreview(); } }XML 布局有點不同。在此應用程序中,我們用於顯示相機預覽的 SurfaceView 包含在一個FrameLayout中,與之並列的還有 LinearLayout,其包含了用於顯示倒計時計數的 TextView 和 觸發倒計時的 Button。FrameLayout 讓所有子項以左上角對齊,彼此之間頂部對齊。這樣 TextView 和 Button 出現在相機預覽頂部。
最後,我們需要確保我們的 AndroidManifest.xml 文件包含Camera權限。<frameLayout android:id="@+id/FrameLayout01" android:layout_width="wrap_content" android:layout_height="wrap_content"> </frameLayout>
Button startStopButton; TextView countdownTextView; Handler timerUpdateHandler; boolean timelapseRunning = false;整數currentTime將以秒為單位,記錄照片的時間間隔, 而不是從總延時往下遞減,如在前面的例子中那樣。常數 SECONDS_BETWEEN_PHOTOS 設置為 60。如同它的名字所暗示,這將用於確定照片之間的等待時間。
int currentTime = 0; public static final int SECONDS_BETWEEN_PHOTOS = 60; // 一分鐘onCreate方法大部分保持不變 - 只是使用新的變量名。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); cameraView = (SurfaceView) this.findViewById(R.id.CameraView); surfaceHolder = cameraView.getHolder(); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceHolder.addCallback(this); countdownTextView = (TextView)findViewById(R.id.CountDownTextView); startStopButton = (Button) findViewById(R.id.CountDownButton); startStopButton.setOnClickListener(this); timerUpdateHandler = new Handler(); }從基於計時器的應用程序,變為一個定時器應用程序,大部分變化來自 onClick 方法 和 Runnable 方法。前者在按鈕被按下時觸發,後者由Handler進行調度。onClick 方法首先檢查定時進程是否已經開始(Button 已經按過),如果沒有,它將其設置為運行態,並以 Runnable 為參數,調用 Handler 的post方法。如果是在定時過程中,按下按鈕意味著停止定時,從而 timerUpdateHandler 的 removeCallbacks 方法被調用。這將清除任何掛起的Runnable對象。
public void onClick(View v) { if (!timelapseRunning) { startStopButton.setText("Stop"); timelapseRunning = true; timerUpdateHandler.post(timerUpdateTask); } else { startStopButton.setText("Start"); timelapseRunning = false; timerUpdateHandler.removeCallbacks(timerUpdateTask); } }我們用一個Handler來做調度,當時間到了之後,Handler將調用Runnable。在我們Handler的run方法中,我們先檢查整數currentTime是否小於我們照片間隔秒數 (SECONDS_BETWEEN_PHOTOS)。如果是,我們只需增加currentTime。如果currentTime不小於等待周期,我們告訴Camera執行拍照,並將currentTime設置回 0,繼續計數。每次循環之後,我們以新currentTime的值,更新TextView顯示,並調度下一次循環。
private Runnable timerUpdateTask = new Runnable() { public void run() { if (currentTime < SECONDS_BETWEEN_PHOTOS) { currentTime++; } else { camera.takePicture(null,null,null,TimelapseSnapShot.this); currentTime = 0; } timerUpdateHandler.postDelayed(timerUpdateTask, 1000); countdownTextView.setText(""+currentTime); } };本例的res/layout/main.xml 接口,當然還有AndroidManifest.xml 跟單計時器版相同。
接入流程及說明官方地址:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.erBW90&
要完成一個輪播圖片,首先想到的應該是使用ViewPager來實現。ViewPager已經有了滑動的功能,我們只要讓它自己滾動。再加上下方的小圓點就行了。所以我們本次的自定
本文實例講述了Android編程實現自定義ProgressBar樣式。分享給大家供大家參考,具體如下:效果圖如下,本例中設置了第一級進度條和第二級進度條。樣式資源:pro
一、前言前一段時間在做視頻開發,由於本人剛接觸視頻開發這塊,所以領導沒有對我提很高的要求,僅僅要求能夠播放本地視頻即可。我想怎麼簡單怎麼做。於是選擇用Android Vi