본문 바로가기
안드로이드 자바

[JAVA][Android] 터치 이벤트로 생성한 커스텀 View를 WebView에 출력하기

by teamnova 2025. 2. 19.
728x90

 

안녕하세요 오늘은 커스텀 View 와 WebView 를 활용한 예제를 만들어보겠습니다 

커스텀 View 에 사용자가 그림을 그리면, 이를 WebView에 띄워보도록 하겠습니다 

 

 

 

 

전체 코드 입니다. 

 

1. MainActivity.java 

 

먼저 커스텀 Drawing View 에서 그림을 그리고 이를 캐시 디렉터리에 저장합니다. 

file 경로로 변환한 뒤에 intent 를 활용해 파일의 경로를 WebViewActivity 에 넘겨줍니다. 

public class MainActivity extends AppCompatActivity {

    private DrawingView drawingView;
    private Button btnSaveAndOpen;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        drawingView = new DrawingView(this);
        btnSaveAndOpen = new Button(this);
        btnSaveAndOpen.setText("Save & Open in WebView");

        btnSaveAndOpen.setOnClickListener(v -> saveAndOpen());

        setContentView(drawingView);
        addContentView(btnSaveAndOpen, new androidx.appcompat.widget.LinearLayoutCompat.LayoutParams(
                androidx.appcompat.widget.LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
                androidx.appcompat.widget.LinearLayoutCompat.LayoutParams.WRAP_CONTENT));
    }


    private void saveAndOpen() {
        Bitmap bitmap = Bitmap.createBitmap(drawingView.getWidth(), drawingView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawingView.draw(canvas);

        try {
            // 이미지 파일을 앱의 캐시 디렉터리에 저장
            File file = new File(getCacheDir(), "drawing.png");
            FileOutputStream fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();

            // file:// 경로로 변환
            String filePath = "file://" + file.getAbsolutePath();

            Intent intent = new Intent(this, WebViewActivity.class);
            intent.putExtra("image_url", filePath);
            startActivity(intent);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

	// View 에 그림을 그리는 부분 
    class DrawingView extends View {
        private Paint paint = new Paint();
        private float x, y;

        public DrawingView(MainActivity context) {
            super(context);
            paint.setColor(Color.BLACK);
            paint.setStrokeWidth(10);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawCircle(x, y, 20, paint);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            x = event.getX();
            y = event.getY();
            invalidate();
            return true;
        }
    }

}

 

 

 

2. WebViewActivity.java

내부적으로 HTML 을 생성해서 Intent 로 전달 받은 이미지 Url 을 WebView 에 로딩합니다 

public class WebViewActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        webView = new WebView(this);
        setContentView(webView);

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccess(true); // 파일 접근 허용

        String imageUrl = getIntent().getStringExtra("image_url");

        // URL 로그로 확인
        Log.d("WebViewActivity", "Image URL: " + imageUrl);

        String html = "<html><body><h1>Your Drawing</h1>" +
                "<img src='" + imageUrl + "' width='100%' />" +
                "</body></html>";

        webView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
    }

}

 

 

 

 

 

시연 영상 입니다. 

감사합니다.