android camera 實現3d效果

來源:互聯網
上載者:User

  

其中 圖片使用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);
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.