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. 어떤 도움이라도 대단히 감사합니다!
그렉