2011-04-07 5 views
0

SurfaceView에 드로잉을 처리하는 클래스를 작성하기 위해 다른 튜토리얼에서 초기 코드를 패턴 화했습니다. 이 튜토리얼 (그리고 내가 찾은 다른 것들)은 xml- 정의 된 SurfaceView를 액티비티 생성시 intiates하는 클래스에 연관시킨다. 내 목표는 레이아웃에서 버튼을 누르고 다시 밀 때 XML 정의 된 표면 뷰에서 애니메이션을 시작하는 것입니다.버튼 누르기를 통해 XML로 정의 된 표면 뷰를 시작하려면 어떻게해야합니까?

또한 애니메이션은 전체 디스플레이가 아니라 내 XML에서 지정한 영역 내에서 실행되어야합니다.

간단히하기 위해 레이아웃을 작동시키는 방법을 알기 전까지는 현재 표면보기에서 서클을 그리는 중입니다.

Go 버튼 (BattleActivity :: onClick)을 클릭하면 표면 뷰가 작성되고 그려 지지만 버튼을 포함하여 레이아웃의 다른 컨트롤을 덮는 전체 디스플레이가 채워집니다. 내 레이아웃 (id = battleView)의 일부로 정의 된 표면보기에서만 애니메이션이 발생하기를 원합니다.

여기 내 XML 레이아웃 코드 (tabBattle.xml)의 하위 섹션이 있습니다.

<LinearLayout 
    android:orientation="vertical" 
    android:gravity="center" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <SurfaceView 
     android:id="@+id/battleView" 
     android:layout_weight="70" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal"/>   

    <Button 
     android:onClick="onClick" 
     android:text=" Go " 
     android:gravity="center" 
     android:layout_weight="30" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 

다음은 나의 주요 활동 수업입니다. 레이아웃 (tabBattle)이있는 탭보기로 이동하면 작성됩니다. Go 버튼을 누르면 onClick이 호출됩니다. onClick에서의 나의 의도는 표면 뷰를 얻고, 새로운 BattleView 인스턴스를 생성하고, BattleView 생성자에 표면 뷰 컨텍스트를 전달하는 것입니다. 이것은 분명히 정확하지는 않지만 나는 이것을 어떻게 다른지 알지 못합니다.

공용 클래스 BattleActivity는 활동 View.OnClickListener 구현 확장 { @Override 공공 무효에서 onCreate (번들 savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.tabbattle); }

@Override 
public void onClick(View v) 
{ 
    SurfaceView battleSurface = (SurfaceView)findViewById(R.id.battleView); 
    setContentView(new BattleView(battleSurface.getContext())); 
} 

}

서피스 뷰 SurfaceView 서브 클래스 :

BattleView은 서피스 뷰 SurfaceView를 확장

공공 클래스의 SurfaceHolder.Callback { 개인 INT circleRadius 구현; 비공개 페인트 circlePaint; UpdateThreadBattle updateThread;

private int width; 
private int height; 
private int xPos; 
private int yPos; 
private int xVel; 
private int yVel; 

public BattleView(Context context) 
{ 
    super(context); 
    getHolder().addCallback(this); 

    circleRadius = 10; 
    circlePaint = new Paint(); 
    circlePaint.setColor(Color.BLUE); 

    xVel = 2; 
    yVel = 2;  
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.WHITE); 
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint); 
} 


@Override 
public void surfaceCreated(SurfaceHolder holder) 
{ 
    Rect surfaceFrame = holder.getSurfaceFrame(); 
    width = surfaceFrame.width(); 
    height = surfaceFrame.height(); 

    xPos = width/2; 
    yPos = circleRadius; 

    updateThread = new UpdateThreadBattle(this); 
    updateThread.setRunning(true); 
    updateThread.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder arg0) 
{ 
    boolean retry = true; 

    updateThread.setRunning(false); 

    while (retry) { 
     try { 
      updateThread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 

     } 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 

} 

} 당신은 아마 의심되는 것처럼

, 나는 일반적으로 안드로이드와 자바에 새로운 AMM. 어떤 도움이라도 대단히 감사합니다!

그렉

답변

0

내가 선택한 궁극적 인 해결책은 타이머를 이용하기보다는 내가보기에 필요한 간단한 애니메이션 과잉이었다 스레드 기반의 표면 애니메이션을 구현하는 것이 었습니다. 그 당시 나는 타이머에 대해 몰랐던 질문을 썼다. 그것은 위대한, brw 작동합니다!