#android #android_fragment
Совсем недавно начал осваивать фрагменты и графику и не до конца понимаю их логику. У меня есть фрагмент, во фрагменте должен запускаться DrawView extends SurfaceView implements SurfaceHolder.Callback. Сейчас это какие-то там фигуры. import android.app.Activity; import android.app.Fragment; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; /** * Created by promoscow on 14.05.17. * Main activity for timer frame. */ public class Timer extends Fragment { DrawView drawView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // DrawView drawView = new DrawView(getActivity()); // getActivity().setContentView(drawView); Log.d("Timer.onCreate", String.valueOf(getActivity())); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("Timer.onCreateView", String.valueOf(inflater)); drawView = new DrawView(getActivity()); return drawView; } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d("onActivityCreated", "okay"); } private class DrawView extends SurfaceView implements SurfaceHolder.Callback { private DrawThread drawThread; public DrawView(Activity timer) { super(timer); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d("DrawView.surfaceChanged", "okay"); drawThread = new DrawThread(getHolder()); drawThread.setRunning(true); drawThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; drawThread.setRunning(false); while (retry) { try { drawThread.join(); retry = false; Log.d("DrawView.surfDestroyed", "okay"); } catch (InterruptedException e) { e.printStackTrace(); } } } } private class DrawThread extends Thread { private boolean running = false; private SurfaceHolder surfaceHolder; Paint paint; Rect rect; RectF rectF; Path path; public DrawThread(SurfaceHolder holder) { this.surfaceHolder = holder; paint = new Paint(); rect = new Rect(); path = new Path(); } public void setRunning(boolean running) { this.running = running; Log.d("DrawThread.setRunning", "okay"); } @Override public void run() { Log.d("DrawThread.run", "okay"); Canvas canvas; while (running) { canvas = null; try { canvas = surfaceHolder.lockCanvas(null); if (canvas == null) continue; canvas.drawRGB(0, 100, 55); paint.setARGB(50, 56, 90, 124); paint.setStrokeWidth(10); paint.setStyle(Paint.Style.STROKE); canvas.drawRect(rectF, paint); paint.setColor(Color.GREEN); canvas.drawArc(rectF, 10, 10, false, paint); Log.d("DrawThread.run", "onWork"); } finally { if (canvas != null) { surfaceHolder.unlockCanvasAndPost(canvas); } } } } } } Логи вот такие: 05-14 22:26:02.158 14610-14610/ru.xpendence.development.gimstopwatch D/Timer.onCreate: ru.xpendence.development.gimstopwatch.StopWatchActivity@2928c3c3 05-14 22:26:02.158 14610-14610/ru.xpendence.development.gimstopwatch D/Timer.onCreateView: com.android.internal.policy.impl.PhoneLayoutInflater@15998504 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/resX: 1440 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/resY: 2392 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/calcDP: 350.0 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/density: 3.5 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/heightPixels: 2392 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/widthPixels: 1440 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/dpHeight: 683.4286 05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/dpWidth: 411.42856 05-14 22:26:02.161 14610-14610/ru.xpendence.development.gimstopwatch D/onActivityCreated: okay То есть, отрабатываются методы onCreate и onCreateView, потом отрабатываются методы активити, в котором находится фрагмент (высчеты dp и проч), потом отрабатывает onActivityCreated и всё... Помогите, пожалуйста, желательно кодом.
Ответы
Ответ 1
Вообще если присмотреться, то Вы не проинициализировали переменную RectF rectF, но активно используете её в блоке try-finally. Я бы сделал ставку на то, что у Вас выпадает NullPointerException, но оно перехватывается этим блоком. А вообще пока не понятно зачем столько сложностей. Зачем использовать SurfaceView вместе со всеми вытекающими проблемами? Вот пример кода прямого наследника View, с тем же функционалом (были убраны неиспользуемые переменные) + регулировкой FPS: public class DrawView extends View { private static final long FPS = 25; private static final long TIME_DELAY = 1000 / FPS; private final Runnable mInvalidator = new Runnable() { @Override public final void run() { invalidate(); } }; private final Paint mPaint = new Paint(); { mPaint.setStrokeWidth(10); mPaint.setStyle(Paint.Style.STROKE); } private final RectF mRectF = new RectF(); public DrawView(Context context) { super(context); } public DrawView(Context context, AttributeSet attrs) { super(context, attrs); } public DrawView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public DrawView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected final void onDraw(final Canvas canvas) { super.onDraw(canvas); canvas.drawRGB(0, 100, 55); mPaint.setARGB(50, 56, 90, 124); canvas.drawRect(mRectF, mPaint); mPaint.setColor(Color.GREEN); canvas.drawArc(mRectF, 10, 10, false, mPaint); postDelayed(mInvalidator, TIME_DELAY); } } FPS в данном случае, это предпочитаемое FPS, совпадение с которым зависит от нагруженности UI. Если что-то более тяжелое планируется, то лучше использовать Bitmap, который будет подготавливаться в другом потоке, после чего выполнять отрисовку методомcanvas.drawBitmap(...).
Комментариев нет:
Отправить комментарий