您的位置:首页 > 移动开发 > Android开发

android 之 Camera使用示例

2015-05-31 18:57 447 查看
android类camera的使用, 实现各种3d变换

=================

布局就省略了, 整个app就两个类

=================

MainActivity.java:

public class MainActivity extends Activity {

Camera camera=new Camera();
MyView targetView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_cameta);
targetView= (MyView) findViewById(R.id.target_view);
((SeekBar)findViewById(R.id.translateX)).setOnSeekBarChangeListener(new MySeekBarListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
targetView.setTranslateX(progress);
}
});
((SeekBar)findViewById(R.id.translateY)).setOnSeekBarChangeListener(new MySeekBarListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
targetView.setTranslateY(progress);
}
});
((SeekBar)findViewById(R.id.translateZ)).setOnSeekBarChangeListener(new MySeekBarListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
targetView.setTranslateZ(progress);
}
});
((SeekBar)findViewById(R.id.rotateX)).setOnSeekBarChangeListener(new MySeekBarListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
targetView.setRotateX(progress);
}
});
((SeekBar)findViewById(R.id.rotateY)).setOnSeekBarChangeListener(new MySeekBarListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
targetView.setRotateY(progress);
}
});
((SeekBar)findViewById(R.id.rotateZ)).setOnSeekBarChangeListener(new MySeekBarListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
targetView.setRotateZ(progress);
}
});
}

class MySeekBarListener implements SeekBar.OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
}


MyView.java

public class MyView extends View {
Paint textPaint=new Paint();
Paint circlePaint=new Paint();
final String drawText="Test View";
int width,height;
int curX,curY;
//
int radius;
RectF rectF=new RectF();
//
Camera camera=new Camera();
float transX,transY,transZ;
float rotateX,rotateY,rotateZ;
Matrix matrix=new Matrix();

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
textPaint.setAntiAlias(true);
textPaint.setColor(Color.WHITE);
textPaint.setStyle(Paint.Style.STROKE);
textPaint.setTextSize(60);
circlePaint.setAntiAlias(true);
circlePaint.setColor(Color.RED);
circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);
//
radius= Utils.dp2px(context,40);
setCirclePosition();
}

private void setCirclePosition() {
rectF.set(curX - radius, curY - radius, curX + radius, curY + radius);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width=w;
height=h;
//        Log.e("w h", width + " " + height);
}

@Override
protected void onDraw(Canvas canvas) {
//
camera.save();
camera.translate(transX, transY, transZ);
camera.rotate(rotateX, rotateY, rotateZ);
camera.getMatrix(matrix);
//绕(curX,curY)变换
matrix.preTranslate(-curX, -curY);
matrix.postTranslate(curX,curY);
camera.restore();
canvas.concat(matrix);
//draw text
canvas.drawText(drawText, 50, 50, textPaint);
canvas.save();
canvas.rotate(90f, width / 2, height / 2);
canvas.drawText(drawText, width / 2, height / 2, textPaint);
canvas.restore();
//draw circle
canvas.drawOval(rectF, circlePaint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
curX= (int) event.getX();
curY= (int) event.getY();
setCirclePosition();
invalidate();
return true;
}

public void setTranslateX(int progress) {
transX=width*progress/100;
invalidate();
}
public void setTranslateY(int progress) {
transY=width*progress/100;
invalidate();
}
public void setTranslateZ(int progress) {
transZ=width*progress/100;
invalidate();
}
public void setRotateX(int progress) {
rotateX=width*progress/100;
invalidate();
}
public void setRotateY(int progress) {
rotateY=width*progress/100;
invalidate();
}
public void setRotateZ(int progress) {
rotateZ=width*progress/100;
invalidate();
}
}


运行界面:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: