어떻게 Surface View 를 사용 하여 물고기 가 움 직 이 는 애니메이션 을 실현 합 니까?
6643 단어 SurfaceView애니메이션
사용자 정의 view 그림 과 비교 하기:
1.view 그림 은 더 블 버퍼 가 없고 surfaceview 는 있 습 니 다.
2.view 그림 업데이트 시 전체 그림 을 업데이트 해 야 하 며,surfaceview 는 일부 영역 을 업데이트 할 수 있 습 니 다.
3.새 스 레 드 는 view 그림 을 직접 업데이트 할 수 없습니다.handler 의 협조 가 필요 합 니 다.
물고기 가 움 직 이 는 애니메이션:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.liuyan.testbutfly.FishView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
자바 코드:
public class FishView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder holder;
private UpdateViewThread updatethread;
private boolean hasSurface;
private Bitmap back;
private Bitmap[] fishs;
private int fishIndex = 0;//
//
private float fishx = 778;
private float fishy = 500;
private float fishSpeed = 6; //
//
private int fishAngle = new Random().nextInt(60);
Matrix matrix = new Matrix();
public FishView(Context context) {
super(context);
Log.i("mydate" , " ");
// surfaceview surfaceholder, callback
holder = getHolder();
holder.addCallback(this);// callback,
hasSurface = false;
back = BitmapFactory.decodeResource(context.getResources() , R.drawable.fishbg);//
int[] id = new int[]{R.drawable.fish0 , R.drawable.fish1 , R.drawable.fish2 ,R.drawable.fish3 ,R.drawable.fish4 ,R.drawable.fish5 ,R.drawable.fish6 ,R.drawable.fish7 ,R.drawable.fish8, R.drawable.fish9};
fishs = new Bitmap[10];
// 10
for (int i = 0 ; i < 10 ; i++){
try {
fishs[i] = BitmapFactory.decodeResource(context.getResources() , id[i]);
} catch (Exception e){
e.printStackTrace();
}
}
Log.i("mydate" , " ");
}
public FishView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.i("mydate" , " ");
// surfaceview surfaceholder, callback
holder = getHolder();
holder.addCallback(this);// callback,
hasSurface = false;
back = BitmapFactory.decodeResource(context.getResources() , R.drawable.fishbg);//
int[] id = new int[]{R.drawable.fish0 , R.drawable.fish1 , R.drawable.fish2 ,R.drawable.fish3 ,R.drawable.fish4 ,R.drawable.fish5 ,R.drawable.fish6 ,R.drawable.fish7 ,R.drawable.fish8, R.drawable.fish9};
fishs = new Bitmap[10];
// 10
for (int i = 0 ; i < 10 ; i++){
try {
// int fishId = (Integer) R.drawable.class.getField("fish" + i).get(null);//
// Log.i("mydate" , " "+ fishId);
fishs[i] = BitmapFactory.decodeResource(context.getResources() , id[i]);
} catch (Exception e){
e.printStackTrace();
}
}
Log.i("mydate" , " ");
}
public void resume(){
//
if (updatethread == null){
updatethread = new UpdateViewThread();
if (hasSurface == true){
updatethread.start();
}
}
}
public void pause(){
//
if (updatethread != null){
updatethread.requestExitAndWait();
updatethread = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) { //surfaceview
hasSurface = true;
resume(); //
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//surfaceview
if (updatethread != null){
updatethread.onWindowResize(width , height);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {//surfaceview
hasSurface = false;
pause(); //
}
class UpdateViewThread extends Thread{
//
private boolean done;
public UpdateViewThread() {
super();
done = false;
}
@Override
public void run() {
SurfaceHolder surfaceholder = holder;
// ,
while (!done){
Canvas canvas = surfaceholder.lockCanvas();// surfaceview,
//
canvas.drawBitmap(back , 0 , 0 , null);
// ,
if (fishx < 0 ){
fishx = 778;
fishy = 500;
fishAngle = new Random().nextInt(60);
}
if (fishy < 0){
fishx = 778;
fishy = 500;
fishAngle = new Random().nextInt(60);
}
// matrix
matrix.reset();
matrix.setRotate(fishAngle);// :
matrix.postTranslate(fishx -= fishSpeed * Math.cos(Math.toRadians(fishAngle)) , fishy -= fishSpeed * Math.sin(Math.toRadians(fishAngle)));
canvas.drawBitmap(fishs[fishIndex++%fishs.length] , matrix , null);
surfaceholder.unlockCanvasAndPost(canvas);// canvas,
try {
Thread.sleep(60);
} catch (Exception e){
e.printStackTrace();
}
}
}
public void requestExitAndWait() {
// ,
done = true;
try {
join();
} catch (Exception e){
e.printStackTrace();
}
}
public void onWindowResize(int width, int height) {
// surfaceview
}
}
}
위치 계산 그림 설명 은 다음 과 같다.
Math.toRadians(fishAngle)
먼저 이 코드 의 뜻 을 이해 하 세 요.0-360 의 각도 제 각 도 를 pi 라디안 각도 로 바 꿉 니 다.물고기 가 끊임없이 움 직 이 고 좌표 가 바 뀌 는 것 은 바로:
현재 x 좌표-속도*cos 각도,현재 y 좌표-속도*sin 각도
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android TextureView, SurfaceView에서 쉽게 스프라이트 시트 애니메이션 ~FPSAnimator~FPSAnimator의 기본적인 사용법은 에 기술했습니다. 이번 기사에서는 SpriteSheet에 대해 자세히 씁니다. SpriteSheetDrawer 만들기 인스턴스를 만들 때 SpriteSheet의 Bitmap ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.