Android보기가 그리기에 응답하지 않습니다.

안드레 요나 담

나는 현재 안드로이드에서 첫 번째 사용자 정의보기를 실험하고 있으며 a를 통해 캔버스에 점을 그리려고 onTouchEvent했지만 여러 시도 후에 실패했습니다. 뷰는 내 터치를 감지하고 터치하면 System.out.println메시지를 성공적으로 인쇄 하지만 여전히 캔버스에 그려지지 않습니다.

여러 번의 시도 끝에 이것이 내가 생각 해낸 것입니다.

package com.techdigy.testapp;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class DrawingBoard extends View {
    Canvas canvas;
    Bitmap bmp;
    BitmapDrawable temp;

    public DrawingBoard(Context context, AttributeSet attributeSet) {
        super(context,attributeSet);
        // TODO Auto-generated constructor stub     
    }
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvas = new Canvas();
        }

    protected void onDraw(Canvas canvas) {
        //draw view
        }
    public boolean onTouchEvent(MotionEvent event) {
        //detect user touch
        float touchX = event.getX();
        float touchY = event.getY();
        Paint paint = new Paint();
        System.out.println("test");
        this.canvas.drawPoint(touchX, touchY, paint);
        temp = new BitmapDrawable(this.bmp);
        this.setBackground(this.temp);
        invalidate();
        return true;
        }
}
하싯 라티

이 코드를 그리기 포인트 또는 캔버스의 모든 것에 사용하십시오.

public class signature extends View {
        private static final float STROKE_WIDTH = 5f;
        private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;
        private Paint paint = new Paint();
        private Path path = new Path();

        private float lastTouchX;
        private float lastTouchY;
        private final RectF dirtyRect = new RectF();

        public signature(Context context, AttributeSet attrs) {
            super(context, attrs);
            paint.setAntiAlias(true);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeWidth(STROKE_WIDTH);
        }

        public void save(View v) {
            Log.v("log_tag", "Width: " + v.getWidth());
            Log.v("log_tag", "Height: " + v.getHeight());
            if (mBitmap == null) {
                mBitmap = Bitmap.createBitmap(mContent.getWidth(),
                        mContent.getHeight(), Bitmap.Config.RGB_565);
                ;
            }
            Canvas canvas = new Canvas(mBitmap);
            try {
                FileOutputStream mFileOutStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory().toString()
                        , "sign.png"));

                v.draw(canvas);
                mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream);
                mFileOutStream.flush();
                mFileOutStream.close();
                String url = Images.Media.insertImage(getContentResolver(),
                        mBitmap, "title", null);
                Log.v("log_tag", "url: " + url);
                // In case you want to delete the file
                // boolean deleted = mypath.delete();
                // Log.v("log_tag","deleted: " + mypath.toString() + deleted);
                // If you want to convert the image to string use base64
                // converter

            } catch (Exception e) {
                Log.v("log_tag", e.toString());
            }
        }

        public void clear() {
            path.reset();
            invalidate();
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawPath(path, paint);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float eventX = event.getX();
            float eventY = event.getY();
            mGetSign.setEnabled(true);

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(eventX, eventY);
                lastTouchX = eventX;
                lastTouchY = eventY;
                return true;

            case MotionEvent.ACTION_MOVE:

            case MotionEvent.ACTION_UP:

                resetDirtyRect(eventX, eventY);
                int historySize = event.getHistorySize();
                for (int i = 0; i < historySize; i++) {
                    float historicalX = event.getHistoricalX(i);
                    float historicalY = event.getHistoricalY(i);
                    expandDirtyRect(historicalX, historicalY);
                    path.lineTo(historicalX, historicalY);
                }
                path.lineTo(eventX, eventY);
                break;

            default:
                debug("Ignored touch event: " + event.toString());
                return false;
            }

            invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
                    (int) (dirtyRect.top - HALF_STROKE_WIDTH),
                    (int) (dirtyRect.right + HALF_STROKE_WIDTH),
                    (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));

            lastTouchX = eventX;
            lastTouchY = eventY;

            return true;
        }

        private void debug(String string) {
        }

        private void expandDirtyRect(float historicalX, float historicalY) {
            if (historicalX < dirtyRect.left) {
                dirtyRect.left = historicalX;
            } else if (historicalX > dirtyRect.right) {
                dirtyRect.right = historicalX;
            }

            if (historicalY < dirtyRect.top) {
                dirtyRect.top = historicalY;
            } else if (historicalY > dirtyRect.bottom) {
                dirtyRect.bottom = historicalY;
            }
        }

        private void resetDirtyRect(float eventX, float eventY) {
            dirtyRect.left = Math.min(lastTouchX, eventX);
            dirtyRect.right = Math.max(lastTouchX, eventX);
            dirtyRect.top = Math.min(lastTouchY, eventY);
            dirtyRect.bottom = Math.max(lastTouchY, eventY);
        }
    }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

UIWebview의 하위보기가로드 요청에 응답하지 않습니다.

분류에서Dev

Riak-JS가 '키'기능에 응답하지 않습니다.

분류에서Dev

Riak-JS가 '키'기능에 응답하지 않습니다.

분류에서Dev

jQuery가 선택기에 응답하지 않습니다.

분류에서Dev

JS가 올바른 정보에 응답하지 않습니다.

분류에서Dev

서버에서 응답을 기록하지 않습니다.

분류에서Dev

서버에 HttpPost 보내기; 응답이 필요하지 않습니다

분류에서Dev

이벤트 리스너 .change가 응답하지 않습니다.

분류에서Dev

경고 기능이 응답하지 않습니다

분류에서Dev

기능이 응답하지 않습니다

분류에서Dev

내 버튼이 Android Studio에서 응답하지 않습니다.

분류에서Dev

.gif가 파이썬에서 응답하지 않습니다.

분류에서Dev

Flutter 제공자가 notifyListeners에 응답하지 않습니다

분류에서Dev

UIToolbar가 터치에 응답하지 않습니다.

분류에서Dev

UITableView가 UITableViewCell 선택에 응답하지 않습니다.

분류에서Dev

Java가 내 입력에 응답하지 않습니다.

분류에서Dev

CCDirector가 presentviewcontroller : animation에 응답하지 않을 수 있습니다.

분류에서Dev

JBoss Forge가 명령에 응답하지 않습니다.

분류에서Dev

게임 서버가 핑에 응답하지 않습니다.

분류에서Dev

Angular가 Ajax 응답에서 작동하지 않습니다.

분류에서Dev

MouseMotionListener가 JButton에 응답하지 않습니다.

분류에서Dev

Bluetooth 장치가 LESetScanParameters 및 LESetScanEnable에 응답하지 않습니다.

분류에서Dev

inotifywait가 / proc / mounts의 변경에 응답하지 않습니다.

분류에서Dev

Scala Swing GUI가 눌린 키에 응답하지 않습니다.

분류에서Dev

JTextField가 JButton에 응답하지 않습니다.

분류에서Dev

UIScrollView의 일부가 터치에 응답하지 않습니다.

분류에서Dev

UIGestureRecognizer가 신속한 3.0에 응답하지 않았습니다.

분류에서Dev

Firebase가 클라우드 기능에 응답하지 않습니다.

분류에서Dev

Android-Google지도에 많은 선 그리기-응용 프로그램이 응답하지 않음

Related 관련 기사

  1. 1

    UIWebview의 하위보기가로드 요청에 응답하지 않습니다.

  2. 2

    Riak-JS가 '키'기능에 응답하지 않습니다.

  3. 3

    Riak-JS가 '키'기능에 응답하지 않습니다.

  4. 4

    jQuery가 선택기에 응답하지 않습니다.

  5. 5

    JS가 올바른 정보에 응답하지 않습니다.

  6. 6

    서버에서 응답을 기록하지 않습니다.

  7. 7

    서버에 HttpPost 보내기; 응답이 필요하지 않습니다

  8. 8

    이벤트 리스너 .change가 응답하지 않습니다.

  9. 9

    경고 기능이 응답하지 않습니다

  10. 10

    기능이 응답하지 않습니다

  11. 11

    내 버튼이 Android Studio에서 응답하지 않습니다.

  12. 12

    .gif가 파이썬에서 응답하지 않습니다.

  13. 13

    Flutter 제공자가 notifyListeners에 응답하지 않습니다

  14. 14

    UIToolbar가 터치에 응답하지 않습니다.

  15. 15

    UITableView가 UITableViewCell 선택에 응답하지 않습니다.

  16. 16

    Java가 내 입력에 응답하지 않습니다.

  17. 17

    CCDirector가 presentviewcontroller : animation에 응답하지 않을 수 있습니다.

  18. 18

    JBoss Forge가 명령에 응답하지 않습니다.

  19. 19

    게임 서버가 핑에 응답하지 않습니다.

  20. 20

    Angular가 Ajax 응답에서 작동하지 않습니다.

  21. 21

    MouseMotionListener가 JButton에 응답하지 않습니다.

  22. 22

    Bluetooth 장치가 LESetScanParameters 및 LESetScanEnable에 응답하지 않습니다.

  23. 23

    inotifywait가 / proc / mounts의 변경에 응답하지 않습니다.

  24. 24

    Scala Swing GUI가 눌린 키에 응답하지 않습니다.

  25. 25

    JTextField가 JButton에 응답하지 않습니다.

  26. 26

    UIScrollView의 일부가 터치에 응답하지 않습니다.

  27. 27

    UIGestureRecognizer가 신속한 3.0에 응답하지 않았습니다.

  28. 28

    Firebase가 클라우드 기능에 응답하지 않습니다.

  29. 29

    Android-Google지도에 많은 선 그리기-응용 프로그램이 응답하지 않음

뜨겁다태그

보관