Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中級第九講--相機調焦

Android中級第九講--相機調焦

編輯:關於Android編程

 

 

 

相機調焦:原理,使用豎直seekbar,根據用戶拖拉來獲得距離,然後以Parameter的形式設置到Camera。

實現OnSeekBarChangeListener

 

/*
* (non-Javadoc)
*
* @see
* android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android
* .widget.SeekBar, int, boolean)
*/
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// TODO Auto-generated method stub
if (myCamera == null || arg2) {
arg0.setProgress(0);
return;
}
try {
Parameters p = myCamera.getParameters();
int maxPa = p.getMaxZoom();
int maxCa = arg0.getMax();
p.setZoom(maxPa * arg1 / maxCa);
myCamera.setParameters(p);
} catch (Exception e) {
// TODO: handle exception
arg0.setProgress(0);
}

}

而實現OnSeekBarChangeListener如下

public class CameraSeekBar extends SeekBar {
/**
*
*/
/**
* @param context
*/
public CameraSeekBar(Context context) {
super(context);
// TODO Auto-generated constructor stub
setThumb(getResources().getDrawable(R.drawable.camera_thumb));
setThumbOffset(6);
setProgressDrawable(getResources().getDrawable(R.drawable.color1));
setIndeterminateDrawable(getResources().getDrawable(R.drawable.color1));
}


public CameraSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw);
}


@Override
protected synchronized void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}


protected void onDraw(Canvas c) {
c.rotate(-90);
c.translate(-getHeight(), 0);
c.drawColor(0x00000000);
super.onDraw(c);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
int i = 0;
i = getMax() - (int) (getMax() * event.getY() / getHeight());
setProgress(i);
onSizeChanged(getWidth(), getHeight(), 0, 0);
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}


}

設置背景和thumb只能在構造方法裡設置,其他地方設置無效,另外seekbar倒立主要采用Canvas的rotate方法;而滾動主要靠獲得手觸高度,來設置進度。camera_thumb是我找的一張小圖片,而color1是一個像素的圖片。

\\

最後如何把這個控件添加到屏幕上,本例采用WindowManager操作

public void addSeekBar() {
// TODO Auto-generated method stub
if (cameraSeekBar != null) {
return;
}

wManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
cameraSeekBar = new CameraSeekBar(context);
cameraSeekBar.setBackgroundColor(0x00000000);
if (wmParams == null) {
initFloatView();
}
wManager.addView(cameraSeekBar, wmParams);
cameraSeekBar.setOnSeekBarChangeListener(this);
}

// 懸浮菜單
private WindowManager.LayoutParams wmParams = null;


private void initFloatView() {
// 設置LayoutParams(全局變量)相關參數
wmParams = new WindowManager.LayoutParams();
wmParams.type = LayoutParams.TYPE_PHONE; // 設置window type
wmParams.format = PixelFormat.RGBA_8888; // 設置圖片格式,效果為背景透明
// 設置Window flag
wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
// 以屏幕左上角為原點,設置x、y初始值
wmParams.x = 100;
wmParams.y = 0;
// 設置懸浮窗口長寬數據
wmParams.width = CWWindowManager.getScreenWidth() / 20;
wmParams.height = CWWindowManager.getScreenHeight() - 170;
;
// 調整懸浮窗口
wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
}

這樣就完成項目的初步要求。

另外如果需要tab間的切換,你可以使用發通知的方式來添加和清除SeekBar

public void removeSeekBar() {
// TODO Auto-generated method stub
if (cameraSeekBar == null) {
return;
}
wManager.removeView(cameraSeekBar);
cameraSeekBar = null;
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved