안드로이드 그리기 진급의 6: 터치 궤적 그리기 및 그림 저장
21533 단어 canvasbitmapidTouchEvent
많은 코드가 앞의 다섯 번의 진급을 이미 설계했기 때문에, 여기에는 군더더기가 없다.핵심 코드만 열거합니다.
제1부분:xml 파일
하나의 단추로 그림을 선택하고, 하나의 단추로 그림을 저장합니다.
코드는 다음과 같습니다.
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
-
- <Button
- android:id="@+id/pickImageBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="pickImage" />
-
- <ImageView
- android:id="@+id/pickedImage"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_launcher" />
-
- <Button
- android:id="@+id/saveBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Save" />
-
- </LinearLayout>
섹션 2: 초기화
코드는 다음과 같습니다.
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Button pickImageBtn = (Button) findViewById(R.id.pickImageBtn);
- Button saveBtn = (Button) findViewById(R.id.saveBtn);
- mImageView = (ImageView) findViewById(R.id.pickedImage);
-
-
- pickImageBtn.setOnClickListener(this);
- saveBtn.setOnClickListener(this);
-
-
- }
섹션 3: 이미지 선택, 터치 감청
코드는 다음과 같습니다.
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Log.d("bitmap", "has onClick");
- switch (v.getId()) {
- case R.id.pickImageBtn:
- Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
- startActivityForResult(intent, REQUEST_CODE);
- break;
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
- // TODO Auto-generated method stub
- super.onActivityResult(requestCode, resultCode, intent);
- Log.d("bitmap", "requestCode is :" + requestCode);
- if (resultCode == RESULT_OK) {
- Log.d("bitmap", "has result ok");
- Uri uri = intent.getData();
-
- int dw = getWindowManager().getDefaultDisplay().getWidth();
- int dh = getWindowManager().getDefaultDisplay().getHeight();
-
- try {
- BitmapFactory.Options opts = new BitmapFactory.Options();
- opts.inJustDecodeBounds = true;// true,
- Bitmap chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts);
- int bw = opts.outWidth;// ,chooseBitmap null, opts config
- int bh = opts.outHeight;
-
- int widthRatio = (int) Math.ceil(bw / (float) dw);
- int heightRatio = (int) Math.ceil(bh / (float) dh);
-
- if (widthRatio > 1 || heightRatio >1) {
- if (widthRatio > heightRatio) {
- opts.inSampleSize = widthRatio;//
- } else {
- opts.inSampleSize = heightRatio;
- }
- }
- opts.inJustDecodeBounds = false;
- chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts);
- Log.d("bitmap", "chooseBitmap is :" + chooseBitmap);
-
- alteredBitmap = Bitmap.createBitmap(chooseBitmap.getWidth(), chooseBitmap.getHeight(), chooseBitmap.getConfig());
- canvas = new Canvas(alteredBitmap);//
- paint = new Paint();
- paint.setColor(Color.WHITE);
- paint.setStyle(Style.STROKE);
- Matrix matrix = new Matrix();
- canvas.drawBitmap(chooseBitmap, matrix , paint);
-
- mImageView.setImageBitmap(alteredBitmap);
- mImageView.setOnTouchListener(this);//
-
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
-
-
- }
-
- }
네 번째 부분: 그림에서 터치하고 이동하며 실시간으로 그립니다.
코드는 다음과 같습니다.
- public boolean onTouch(View v, MotionEvent event) {
- // TODO Auto-generated method stub
- Log.d("touch_draw", "ontouch()");
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_UP:
- // upX = event.getX();
- // upY = event.getY();// , 。 ,
- // canvas.drawLine(downX, downY, upX, upY, paint);
- // mImageView.invalidate();
- // break;
- case MotionEvent.ACTION_DOWN:
- downX = event.getX();
- downY = event.getY();
- break;
- case MotionEvent.ACTION_MOVE:
- upX = event.getX();
- upY = event.getY();
- canvas.drawLine(downX, downY, upX, upY, paint);
- mImageView.invalidate();
- downX = upX;
- downY = upY;
- break;
- case MotionEvent.ACTION_CANCEL:
- break;
-
- }
-
- return true;
- }
섹션 5: 이미지 저장
코드는 다음과 같습니다.
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Log.d("bitmap", "has onClick");
- switch (v.getId()) {
- case R.id.pickImageBtn:
- Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
- startActivityForResult(intent, REQUEST_CODE);
- break;
- case R.id.saveBtn://
-
-
- /*
- * PNG : :
- * JPEG: , 。 “ ” ,
- */
-
-
- if (null != alteredBitmap) {
- Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());// uri
-
- try {
- OutputStream imageFileOS = getContentResolver().openOutputStream(imageFileUri);//
-
- alteredBitmap.compress(CompressFormat.JPEG, 90, imageFileOS);//
-
- Toast.makeText(this, "has saved", Toast.LENGTH_SHORT).show();
-
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- break;
- }
- }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Jetpack Compose를 사용한 커스텀 컴포저블첫 번째 기사 시리즈에서는 Jetpack Compose에서 맞춤 보기를 만드는 방법에 대해 이야기하고 싶습니다. Labeled Ranged Slider의 예에서는 완전히 맞춤설정된 컴포저블을 만드는 데 필요한 단계를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.