#java #android_studio #android #activity
Здравствуйте,помогите разобраться в чем причина.. Пишу приложение в Android Studio. Запускаю кнопкой Run. На подключенном устройстве все запускается. Ошибок нет, работает как надо. : ................................................................................................................................................................ Но если я запускаю это приложение с телефона нажатием по значку. То не запускается. Сначала белый экран. Потом темный и все... висит.. Я предполагаю что это как то связано с тем что я в setContentView() помещаю класс DrawSurface(this). Потому что с R.layout.activity_circle не возникает проблем. Вот код: public class CircleActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new DrawSurface(this)); //setContentView(R.layout.activity_circle); } } Класс DrawSurface: public class DrawSurface extends SurfaceView implements SurfaceHolder.Callback{ private DrawThread thread; private String TAG = "LOG"; public DrawSurface(Context context){ super(context); getHolder().addCallback(this); thread = new DrawThread(getHolder(), this); setFocusable(true); } @Override public void surfaceCreated(SurfaceHolder holder) { thread.setRunning(true); thread.start(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; while(retry){ try{ thread.join(); retry = false; }catch(InterruptedException e){ } } } public boolean onTouchEvent(MotionEvent event){ if(event.getAction()== MotionEvent.ACTION_DOWN){ thread.touchX = event.getX(); thread.touchY = event.getY(); Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY()); } return true; } } Класс DrawThread: public class DrawThread extends Thread{ private double speedMoveX = 1; private double speedMoveY = 1; private double Y0 = 0; private double Angle = 1; private Random rand; private double gravityForce = 1; private int newAngle = 0; private Bitmap myBitmap; private long prevTime; private float X=0; private float Y=0; protected float touchX=-40; protected float touchY=-40; private Paint paint; private Paint paintScore; private int currentScore = 0; private int textSize = 54; private boolean running = false; private SurfaceHolder surfaceHolder; private DrawSurface drawSurface; private String LOG_TAG = "LOG"; public DrawThread(SurfaceHolder surfaceHolder, DrawSurface drawSurface){ super(); this.surfaceHolder = surfaceHolder; prevTime = System.currentTimeMillis(); rand = new Random(); Angle = rand.nextInt(25); paint = new Paint(); paintScore = new Paint(); paintScore.setTextSize(textSize); } public void setRunning(boolean running){ this.running = running; } public void updateCord(){ X += speedMoveX * Math.cos(Angle * Math.PI / 180); Y += speedMoveY * Math.sin(Angle * Math.PI / 180); if (Y > Y0+9.8){ speedMoveY += gravityForce; Y0 = Y; } if (X > 420){ X = 420; speedMoveX = -speedMoveX; } if (X < 60){ X = 60; speedMoveX = -speedMoveX; } if (Y >= 760){ Y = 760; speedMoveY = -speedMoveY; } if (Y < 60){ Y = 60; speedMoveY = -speedMoveY; } } private boolean isHit(){ boolean hit = false; if(touchX > X-60 && touchX < X+60 && touchY > Y-60 && touchY1){ prevTime = now; updateCord(); }*/ try { canvas = surfaceHolder.lockCanvas(null); if (canvas == null) continue; canvas.drawColor(Color.GRAY); Log.d("LOG onDraw()", "onDraw()"); canvas.drawText("touchX = " + touchX + ", touchY = " + touchY, 10, 20, paint); canvas.drawText("Score:",200,50,paintScore); canvas.drawText(currentScore+"" ,360,50,paintScore); canvas.drawCircle(X, Y,60, paint); if (isHit()){ currentScore++; paint.setColor(Color.BLUE); Angle = rand.nextInt(20); X = rand.nextInt(330); Y = rand.nextInt(760); } else{ paint.setColor(Color.RED); touchX=-40; touchY=-40; } }finally { if (canvas != null){ surfaceHolder.unlockCanvasAndPost(canvas); } } } Log.d(LOG_TAG, "Game loop executes"+tickCount+" times"); } } Вот AndroidManifect.xml :
Ответы
Ответ 1
Проблема решена!;) В классе DrawSurface в методе public void surfaceDestroyed(): public class DrawSurface extends SurfaceView implements SurfaceHolder.Callback{ ...//... ...//... public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; thread.setRunning(false); ////// Нужно добавить эту строку!/////// while(retry){ try{ thread.join(); retry = false; }catch(InterruptedException e){} } } }Ответ 2
Вообще не стоит делать экраном приложения вьюху, так обычно поступают при разработке игр, и если у вас при запуске из ADT всё норм, то это наврятли связано с запуском через кнопку, а если и связано, то тут уже проблемы могу быть с манифестом. А ошибку не кидает? Если кидает, то покажите лог. А если у вас не возникает проблем при добавлении Layout, то нафига вы шаманите, просто добавьте layout, который будет содержать вашу въюху и всё. Вижу у вас в коде, что вы не передаёте атрибуты в вашей View, а это необходимо. DrawSurface(Context context, AttributeSet attrs){ super(context, attrs); }
Комментариев нет:
Отправить комментарий