어떻게 Surface View 를 사용 하여 물고기 가 움 직 이 는 애니메이션 을 실현 합 니까?

본 논문 의 사례 는 Surface View 를 사용 하여 애니메이션 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
사용자 정의 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 각도
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기