4.2.2 기존 이미지에 그리기

18548 단어 이미지
Canvas 객체에 그리는 것이기 때문에 제3장에서 기술한 기술을 사용하여 Canvas 객체에 이미지를 그리고 그 이미지를 그릴 수 있습니다.
다음은 완전한 예시를 소개한다.
 1 package com.nthm.androidtest;

 2 

 3 import android.app.Activity;

 4 import android.content.Intent;

 5 import android.graphics.Bitmap;

 6 import android.graphics.BitmapFactory;

 7 import android.graphics.Canvas;

 8 import android.graphics.Color;

 9 import android.graphics.Matrix;

10 import android.graphics.Paint;

11 import android.net.Uri;

12 import android.os.Bundle;

13 import android.view.Display;

14 import android.view.MotionEvent;

15 import android.view.View;

16 import android.view.View.OnClickListener;

17 import android.view.View.OnTouchListener;

18 import android.widget.Button;

19 import android.widget.ImageView;

행사는 온클릭 리스트와 온터치 리스트가 이뤄진다.OnClickListener는 단추의 클릭 이벤트에 응답할 수 있도록 합니다.OnTouchListener는 터치스크린을 사용하여 ImageView에 그릴 수 있습니다.
1 public class ChoosePictureDraw extends Activity implements OnTouchListener,

2         OnClickListener {

두 가지 주요 UI 요소가 있습니다.첫 번째는 ImageView로, 그릴 비트맵 객체를 표시합니다.두 번째는 갤러리 프로그램에서 그림을 선택하기 위해 누르는 단추입니다.
1      private ImageView chooseImageView;

2      private Button choosePicture;

비트맵 객체가 두 개 필요합니다.첫 번째는 선택한 이미지의 배율 조정 버전을 포함하고 두 번째는 가변 버전입니다.첫 번째 비트맵 객체를 두 번째 비트맵 객체에 그린 다음 그 위에 그립니다.
 1      private Bitmap bmp;

 2      private Bitmap alteredBitmap;

 3      private Canvas canvas;

 4      private Paint paint;

 5      private Matrix matrix;

 6     @Override

 7     protected void onCreate(Bundle savedInstanceState) {

 8         super.onCreate(savedInstanceState);

 9         setContentView(R.layout.choosepicturedraw);

10         chooseImageView=(ImageView) findViewById(R.id.ChooseImageView);

11         choosePicture=(Button) findViewById(R.id.ChoosePictureButton);

ImageView와 버튼에 대한 참조를 얻은 후 각 이벤트(Onclick 및 OnTouch)의 모니터를 활동으로 설정합니다.
1         choosePicture.setOnClickListener(this);

2         chooseImageView.setOnTouchListener(this);

3     }

onClick 방법은 다음과 같습니다.Gallery 응용 프로그램에서 이미지를 선택할 수 있도록 표준 의도를 사용합니다.
1     @Override

2     public void onClick(View v) {

3           Intent choosePictureIntent=new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

4           startActivityForResult(choosePictureIntent, 0);

5     }

사용자가 이미지를 선택한 후 onActivityResult 메서드를 호출합니다.선택한 이미지를 비트맵 객체에 로드하고 화면 크기로 확대/축소합니다.
 1     @Override

 2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {

 3         super.onActivityResult(requestCode, resultCode, data);

 4         if(resultCode==RESULT_OK){

 5             Uri imageFileUri=data.getData();

 6             Display currentDisplay=getWindowManager().getDefaultDisplay();

 7             int dw=currentDisplay.getWidth();

 8             int dh=currentDisplay.getHeight();

 9             try{

10                 BitmapFactory.Options bmpBitmapFactoryOptions=new BitmapFactory.Options();

11                 bmpBitmapFactoryOptions.inJustDecodeBounds=true;

12                 bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpBitmapFactoryOptions);

13                 int heightRatio=bmpBitmapFactoryOptions.outHeight;

14                 int widthRatio=bmpBitmapFactoryOptions.outWidth;

15                 if(heightRatio>1&&widthRatio>1){

16                     if(heightRatio>widthRatio){

17                         bmpBitmapFactoryOptions.inSampleSize=heightRatio;

18                     }else{

19                         bmpBitmapFactoryOptions.inSampleSize=widthRatio;

20                     }

21                 }

22                 bmpBitmapFactoryOptions.inJustDecodeBounds=false;

23                 bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpBitmapFactoryOptions);

비트맵 대상을 불러온 후, 가변적인 비트맵 대상alteredBitmap을 만들고, 그 안에 첫 번째 비트맵 대상을 그립니다.
 1                 alteredBitmap=Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());

 2                 canvas=new Canvas(alteredBitmap);

 3                 paint=new Paint();

 4                 paint.setColor(Color.GREEN);

 5                 paint.setStrokeWidth(5);

 6                 matrix=new Matrix();

 7                 canvas.drawBitmap(bmp, matrix, paint);

 8                 chooseImageView.setImageBitmap(alteredBitmap);

 9                 chooseImageView.setOnTouchListener(this);

10             }catch(Exception e){

11                 

12             }

13         }

14     }

지금은 단지 이전의 같은 방식으로 온터치를 실현하는 방법일 뿐이다.빈 비트맵 Canvas 객체와는 다르게 기존 이미지 위에 그려집니다.
 1     private float downx=0;

 2     private float downy=0;

 3     private float upx=0;

 4     private float upy=0;

 5     @Override

 6     public boolean onTouch(View v, MotionEvent event) {

 7         switch (event.getAction()) {

 8         case MotionEvent.ACTION_DOWN:

 9             downx=event.getX();

10             downy=event.getY();

11             break;

12         case MotionEvent.ACTION_MOVE:

13             upx=event.getX();

14             upy=event.getY();

15             canvas.drawLine(downx, downy, upx, upy, paint);

16             chooseImageView.invalidate();

17             downx=upx;

18             downy=upy;

19             break;

20         case MotionEvent.ACTION_UP:

21             upx=event.getX();

22             upy=event.getY();

23             canvas.drawLine(downx, downy, upx, upy, paint);

24             chooseImageView.invalidate();

25             break;

26         case MotionEvent.ACTION_CANCEL:

27             

28             break;

29         default:

30             break;

31         }

32         return true;

33     }

34 

35 }

다음은 위 활동의 레이아웃 XML 파일입니다.이것은 표준 LinearLayout에서 이 ImageView와 단추를 지정합니다.
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 2     android:layout_width="match_parent"

 3     android:layout_height="match_parent"

 4     android:orientation="vertical"

 5     >

 6     <Button 

 7         android:id="@+id/ChoosePictureButton"

 8         android:layout_width="fill_parent"

 9         android:layout_height="wrap_content"

10         android:text="Choose Picture"/>

11     <ImageView  

12         android:id="@+id/ChooseImageView"

13         android:layout_width="wrap_content"

14         android:layout_height="wrap_content"

15         android:contentDescription="@string/app_name"/>

16 </LinearLayout>

좋은 웹페이지 즐겨찾기