안드로이드 그리기 진급의 6: 터치 궤적 그리기 및 그림 저장


많은 코드가 앞의 다섯 번의 진급을 이미 설계했기 때문에, 여기에는 군더더기가 없다.핵심 코드만 열거합니다.
제1부분:xml 파일
하나의 단추로 그림을 선택하고, 하나의 단추로 그림을 저장합니다.
코드는 다음과 같습니다.

  
  
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.     <Button 
  8.         android:id="@+id/pickImageBtn" 
  9.         android:layout_width="wrap_content" 
  10.         android:layout_height="wrap_content" 
  11.         android:text="pickImage" /> 
  12.  
  13.     <ImageView 
  14.         android:id="@+id/pickedImage" 
  15.         android:layout_width="wrap_content" 
  16.         android:layout_height="wrap_content" 
  17.         android:src="@drawable/ic_launcher" /> 
  18.  
  19.     <Button 
  20.         android:id="@+id/saveBtn" 
  21.         android:layout_width="wrap_content" 
  22.         android:layout_height="wrap_content" 
  23.         android:text="Save" /> 
  24.  
  25. </LinearLayout> 

섹션 2: 초기화
코드는 다음과 같습니다.

  
  
  
  
  1. public void onCreate(Bundle savedInstanceState) { 
  2.         super.onCreate(savedInstanceState); 
  3.         setContentView(R.layout.main); 
  4.          
  5.         Button pickImageBtn = (Button) findViewById(R.id.pickImageBtn); 
  6.         Button saveBtn = (Button) findViewById(R.id.saveBtn); 
  7.         mImageView = (ImageView) findViewById(R.id.pickedImage); 
  8.          
  9.          
  10.         pickImageBtn.setOnClickListener(this); 
  11.         saveBtn.setOnClickListener(this); 
  12.  
  13.          
  14.     } 

섹션 3: 이미지 선택, 터치 감청
코드는 다음과 같습니다.
 

  
  
  
  
  1. public void onClick(View v) { 
  2.         // TODO Auto-generated method stub 
  3.         Log.d("bitmap""has onClick"); 
  4.         switch (v.getId()) { 
  5.         case R.id.pickImageBtn: 
  6.             Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
  7.             startActivityForResult(intent, REQUEST_CODE); 
  8.             break

 

  
  
  
  
  1. @Override 
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
  3.         // TODO Auto-generated method stub 
  4.         super.onActivityResult(requestCode, resultCode, intent); 
  5.         Log.d("bitmap""requestCode is :" + requestCode); 
  6.         if (resultCode == RESULT_OK) { 
  7.             Log.d("bitmap""has result ok"); 
  8.             Uri uri = intent.getData(); 
  9.              
  10.             int dw = getWindowManager().getDefaultDisplay().getWidth(); 
  11.             int dh = getWindowManager().getDefaultDisplay().getHeight(); 
  12.              
  13.             try { 
  14.                 BitmapFactory.Options opts = new BitmapFactory.Options(); 
  15.                 opts.inJustDecodeBounds = true;// true,  
  16.                 Bitmap chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts); 
  17.                 int bw = opts.outWidth;// ,chooseBitmap null, opts config 
  18.                 int bh = opts.outHeight; 
  19.                  
  20.                 int widthRatio = (int) Math.ceil(bw / (float) dw); 
  21.                 int heightRatio = (int) Math.ceil(bh / (float) dh); 
  22.                  
  23.                 if (widthRatio > 1 || heightRatio >1) { 
  24.                     if (widthRatio > heightRatio) { 
  25.                         opts.inSampleSize = widthRatio;//  
  26.                     } else { 
  27.                         opts.inSampleSize = heightRatio; 
  28.                     } 
  29.                 } 
  30.                 opts.inJustDecodeBounds = false
  31.                 chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts); 
  32.                 Log.d("bitmap""chooseBitmap is :" + chooseBitmap); 
  33.                  
  34.                 alteredBitmap = Bitmap.createBitmap(chooseBitmap.getWidth(), chooseBitmap.getHeight(), chooseBitmap.getConfig()); 
  35.                 canvas = new Canvas(alteredBitmap);//  
  36.                 paint = new Paint();         
  37.                 paint.setColor(Color.WHITE); 
  38.                 paint.setStyle(Style.STROKE); 
  39.                 Matrix matrix = new Matrix(); 
  40.                 canvas.drawBitmap(chooseBitmap, matrix , paint); 
  41.                  
  42.                 mImageView.setImageBitmap(alteredBitmap); 
  43.                 mImageView.setOnTouchListener(this);//  
  44.                  
  45.             } catch (FileNotFoundException e) { 
  46.                 // TODO Auto-generated catch block 
  47.                 e.printStackTrace(); 
  48.             } 
  49.              
  50.              
  51.              
  52.         } 
  53.          
  54.     } 

 
네 번째 부분: 그림에서 터치하고 이동하며 실시간으로 그립니다.
코드는 다음과 같습니다.

  
  
  
  
  1. public boolean onTouch(View v, MotionEvent event) { 
  2.         // TODO Auto-generated method stub 
  3.         Log.d("touch_draw""ontouch()"); 
  4.          
  5.         switch (event.getAction()) { 
  6.         case MotionEvent.ACTION_UP: 
  7. //          upX = event.getX(); 
  8. //          upY = event.getY();// , 。 ,  
  9. //          canvas.drawLine(downX, downY, upX, upY, paint); 
  10. //          mImageView.invalidate(); 
  11. //          break; 
  12.         case MotionEvent.ACTION_DOWN: 
  13.             downX = event.getX(); 
  14.             downY = event.getY(); 
  15.             break
  16.         case MotionEvent.ACTION_MOVE: 
  17.             upX = event.getX(); 
  18.             upY = event.getY(); 
  19.             canvas.drawLine(downX, downY, upX, upY, paint); 
  20.             mImageView.invalidate(); 
  21.             downX = upX; 
  22.             downY = upY; 
  23.             break
  24.         case MotionEvent.ACTION_CANCEL: 
  25.             break
  26.  
  27.         } 
  28.          
  29.         return true
  30.     } 

섹션 5: 이미지 저장
코드는 다음과 같습니다.
 

  
  
  
  
  1. public void onClick(View v) { 
  2.         // TODO Auto-generated method stub 
  3.         Log.d("bitmap""has onClick"); 
  4.         switch (v.getId()) { 
  5.         case R.id.pickImageBtn: 
  6.             Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
  7.             startActivityForResult(intent, REQUEST_CODE); 
  8.             break
  9.         case R.id.saveBtn://  
  10.              
  11.              
  12.             /* 
  13.              * PNG : :  
  14.              * JPEG: , 。 “ ” ,  
  15.              */ 
  16.  
  17.              
  18.             if (null != alteredBitmap) { 
  19.                 Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());// uri 
  20.                  
  21.                 try { 
  22.                      OutputStream imageFileOS = getContentResolver().openOutputStream(imageFileUri);//  
  23.                       
  24.                      alteredBitmap.compress(CompressFormat.JPEG, 90, imageFileOS);//  
  25.                       
  26.                      Toast.makeText(this"has saved", Toast.LENGTH_SHORT).show(); 
  27.                       
  28.                 } catch (FileNotFoundException e) { 
  29.                     // TODO Auto-generated catch block 
  30.                     e.printStackTrace(); 
  31.                 } 
  32.             } 
  33.             break
  34.         } 
  35.     } 

좋은 웹페이지 즐겨찾기