Я создал свой исходный код из другого учебника, чтобы создать классы для обработки рисунков в SurfaceView. Этот урок (и другие, которые я обнаружил) связывает определенный SurfaceView xml с классом, который инициируется при создании действия. Моя цель - запускать анимацию в виде поверхности, заданном в формате xml, после нажатия кнопки в макете и прекращения ее при повторном нажатии.
Кроме того, анимация должна запускаться в области, указанной в моем xml (а не во всем отображении).
Для простоты я в настоящее время рисую только круг в виде поверхности, пока не выясню, как заставить работать мой макет.
Итак, когда я нажимаю кнопку «Перейти» (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). OnClick вызывается, когда я нажимаю кнопку Go. Мое намерение в onClick - получить вид поверхности, создать новый экземпляр BattleView и передать контекст вида поверхности конструктору BattleView. Это явно не правильно, но я понятия не имею, как еще это сделать.
открытый класс BattleActivity расширяет Activity реализует View.OnClickListener
{
@Override
public void onCreate (BundlevedInstanceState)
{
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;
частный круг покраскиPaint;
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
}
}
Как вы, вероятно, подозревали, я новичок в Android и Java в целом. Любая помощь с благодарностью!
Грег