android camera 实现3d效果

效果图

  

其中 图片使用ImageView来展示

       50下边其实是个文本框

       变形:按钮,点击后 将图片沿着Y轴 旋转文本框 指定的角度。

 

实现的代码很简单:

public class Base3dImp extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_3d_imp);

this.findViewById(R.id.btn_changeShape).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
EditText tvGress=(EditText) Base3dImp.this.findViewById(R.id.et_degress);
int degress=Integer.parseInt(tvGress.getText().toString().trim());
if(degress%90==0)
degress+=1;
Bitmap bmp=BitmapFactory.decodeResource(getResources(),R.drawable.p1);

Matrix matrix=new Matrix();System.out.println("martrix:"+matrix.toString());
Camera camera=new Camera();
camera.save();
// camera.rotateY(degress);
// camera.rotateX(degress);
camera.getMatrix(matrix);
camera.restore();System.out.println("martrix1:"+matrix.toString());

ImageView img=(ImageView)Base3dImp.this.findViewById(R.id.iv_base_3d);
int centerX=img.getWidth()/2;
int centerY=img.getHeight()/2;

Bitmap bmp1=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
System.out.println("martrix1:"+matrix.toString());

img.setImageBitmap(bmp1);

}
});

}
}

 

 

上述代码 为了便于观察你 rotateY(degress)方法旋转的实现过程, 下面将旋转动画:

先上效果图:

      

  OpenGLActivity的代码如下:

package com.example.opengl;

import android.app.Activity;
import android.content.Intent;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.AccelerateInterpolator;
import android.widget.ImageView;

import com.example.opengl.animation.Rotate3dAnimation;
import com.example.opengl.render.CylinderRender;
import com.example.opengl.render.HaxagonRender;
import com.example.opengl.render.RotateTriangle;
/**
* OpenGL练习
* @author YangBaoBao
*
*/
public class OpenGLActivity extends Activity {

private View v;
private ImageView img;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// GLSurfaceView surface=new GLSurfaceView(this);
// surface.requestFocus();//获取焦点
// surface.setFocusableInTouchMode(true);//设置为可触控
// trigle(surface);
// sixshape(surface);
// clindershape(surface);
setContentView(R.layout.activity_open_gl);
v=this.findViewById(R.id.rl_main);
img=(ImageView) this.findViewById(R.id.img_animation);
this.findViewById(R.id.btn_startAnimation).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
applyRotation(0, 0, 360); 
//
// Intent i=new Intent(OpenGLActivity.this,Transition3d.class);
// OpenGLActivity.this.startActivity(i);
}
});

// View v=null;v.set

}
private void trigle(GLSurfaceView surface)
{
RotateTriangle rtgl=new RotateTriangle();
surface.setOnTouchListener(new RotateTriangle.MyTouchListener(rtgl));
surface.setRenderer(rtgl);
}
private void sixshape(GLSurfaceView surface)
{
HaxagonRender hr=new HaxagonRender();
surface.setOnTouchListener(new HaxagonRender.MyTouchListener(hr,surface));
surface.setRenderer(hr);
}
private void clindershape(GLSurfaceView surface)
{
CylinderRender hr=new CylinderRender();
surface.setOnTouchListener(new CylinderRender.MyTouchListener(hr,surface));
surface.setRenderer(hr);
}
// public void staticAnimation()
// {
// Rotate3dAnimation ra=new Rotate3dAnimation(0, 180,img.getX()/2,img.getY()/2,310,false);
// img.startAnimation(ra);
// }
private void applyRotation(int position, float start, float end) { 
// Find the center of the container 
final float centerX = img.getWidth() / 2.0f; 
final float centerY = img.getHeight() / 2.0f; 

// Create a new 3D rotation with the supplied parameter 
// The animation listener is used to trigger the next animation 
final Rotate3dAnimation rotation = 
new Rotate3dAnimation(start, end, centerX, centerY, 0, true); 
rotation.setDuration(5000); 
rotation.setFillAfter(true); 
rotation.setInterpolator(new AccelerateInterpolator()); 
// rotation.setAnimationListener(new DisplayNextView(position)); 

img.startAnimation(rotation); 

}

 

Rotate3dAnimation为实现的动画类,也是很简单的:

  先上效果图:

package com.example.opengl.animation;

import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.graphics.Camera;
import android.graphics.Matrix;

public class Rotate3dAnimation extends Animation {
private final float mFromDegrees;
private final float mToDegrees;
private final float mCenterX;
private final float mCenterY;
private final float mDepthZ;
private final boolean mReverse;
private Camera mCamera;


public Rotate3dAnimation(float fromDegrees, float toDegrees,
float centerX, float centerY, float depthZ, boolean reverse) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mCenterX = centerX;
mCenterY = centerY;
mDepthZ = depthZ;
mReverse = reverse;
}

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
}

/**

动画的主要实现方法

*/

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float fromDegrees = mFromDegrees;
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
System.out.println("degress:"+degrees);

System.out.println("interpolatedTime:"+((mToDegrees - fromDegrees) * interpolatedTime));

final float centerX = mCenterX;
final float centerY = mCenterY;
final Camera camera = mCamera;

final Matrix matrix = t.getMatrix();

camera.save();
if (mReverse) {
camera.translate(0.0f, 0.0f,mDepthZ * interpolatedTime);//mDepthZ * interpolatedTime+100
} else {
camera.translate(0.0f, 0.0f, mDepthZ* (1.0f - interpolatedTime));//mDepthZ * (1.0f - interpolatedTime)+100
}
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();

matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值