[OFFEN] Schreiben sehr langsam mit Canvas und SurfaceView

H

Helveticus

Neues Mitglied
0
Hallo zusammen,

I habe eine Android 5.1 Anwendung entwickelt mit welcher ich mit einem Stylus auf einem Tablet schreiben kann. Ich habe dies mittels SurfaceView und Canvas gemacht. Der Code befindet sich unten. Leider ist das Schreiben sehr langsam, speziell wenn es mehr Text wird, wird es langsam. Ich denke, dass das Problem ist, dass es in Software gerendert wird. Natürlich wäre eine Möglichkeit auf OpenGL umzustellen, allerdings kenne ich das überhaupt nicht.

Gibt es eine Möglichkeit meinen Code zu optimieren, so dass ein flüssiges Schreiben möglich ist? Oder wäre es einfach meinen Code zu OpenGL umzustellen?

Code:
 public class DrawingView extends SurfaceView implements OnTouchListener {
        private Bitmap mBitmap;
        private Canvas m_Canvas;
        private Path m_Path;
        private Paint m_Paint;
        private ArrayList<Pair<Path, Paint>> paths = new ArrayList<>();
        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;
        private boolean isEraserActive = false;
        private int pathCount = 0;
        private View rectangleView;
   
        public DrawingView(Context context, AttributeSet attr) {
            super(context, attr);
   
            setFocusable(true);
            setFocusableInTouchMode(true);
            setBackgroundColor(Color.TRANSPARENT);
            this.setOnTouchListener(this);
            onCanvasInitialization();
            setAlpha(0.99f);
        }
   
        public void onCanvasInitialization() {
            m_Paint = new Paint();
            m_Paint.setAntiAlias(true);
            m_Paint.setDither(true);
            m_Paint.setColor(Color.parseColor("#000000"));
            m_Paint.setStyle(Paint.Style.STROKE);
            m_Paint.setStrokeJoin(Paint.Join.ROUND);
            m_Paint.setStrokeCap(Paint.Cap.ROUND);
            m_Paint.setStrokeWidth(2);
   
            m_Path = new Path();
            Paint newPaint = new Paint(m_Paint);
            paths.add(new Pair<>(m_Path, newPaint));
        }
   
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
   
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);
            m_Canvas = new Canvas(mBitmap);
        }
   
        @Override
        public boolean onTouch(View arg0, MotionEvent event) {
            float x = event.getX();
            float y = event.getY();
   
            if (rectangleView != null) {
                ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) rectangleView.getLayoutParams();
                params.leftMargin = (int) x;
                params.topMargin = (int) y;
                rectangleView.setLayoutParams(params);
                return true;
            } else {
                if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
                    isEraserActive = true;
                } else {
                    isEraserActive = false;
                }
   
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        touch_start(x, y);
                        invalidate();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        touch_move(x, y);
                        invalidate();
                        break;
                    case MotionEvent.ACTION_UP:
                        touch_up();
                        invalidate();
                        break;
                }
                return true;
            }
        }
   
        @Override
        protected void onDraw(Canvas canvas) {
            for (Pair<Path, Paint> p : paths) {
                canvas.drawPath(p.first, p.second);
            }
        }
   
        private void touch_start(float x, float y) {
            if (isEraserActive) {
                m_Paint.setStrokeWidth(20);
                m_Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                Paint newPaint = new Paint(m_Paint);
                paths.add(new Pair<>(m_Path, newPaint));
            } else {
                m_Paint.setColor(Color.BLACK);
                m_Paint.setStrokeWidth(2);
                m_Paint.setXfermode(null);
                Paint newPaint = new Paint(m_Paint);
                paths.add(new Pair<>(m_Path, newPaint));
                pathCount++;
            }
   
            m_Path.reset();
            m_Path.moveTo(x, y);
            mX = x;
            mY = y;
        }
   
        private void touch_move(float x, float y) {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                m_Path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
                mX = x;
                mY = y;
            }
        }
   
        private void touch_up() {
            m_Path.lineTo(mX, mY);
            m_Canvas.drawPath(m_Path, m_Paint);
            m_Path = new Path();
            Paint newPaint = new Paint(m_Paint);
            paths.add(new Pair<>(m_Path, newPaint));
        }
   
        public void reset() {
            for (Pair<Path, Paint> p : paths) {
                p.first.reset();
            }
            paths.clear();
            pathCount = 0;
            mBitmap.eraseColor(Color.TRANSPARENT);
            invalidate();
        }
    }
 
Hallo Helveticus.

ich habe leider noch nicht mit dem Pen gearbeitet ...

Vielleicht solltest du mal deine Views OHNE Constraint umsetzen und es eher rudimentät basic versuchen.
 
Hi swa

Wie meinst du ohne Constraint?
 
Code:
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) rectangleView.getLayoutParams();

Du sollst mit ganz normalen RelativeView und LinearView arbeiten
und dein Canvas Drawing von einen View und nicht von einem SurfaceView ableiten

Code:
public class DrawingView extends View implements OnTouchListener {


API Beispiel :
Canvas and Drawables | Android Developers
 
Zuletzt bearbeitet:

Ähnliche Themen

S
  • skywalker22
Antworten
1
Aufrufe
145
swa00
swa00
S
Antworten
17
Aufrufe
518
jogimuc
J
B
Antworten
4
Aufrufe
406
bb321
B
Zurück
Oben Unten