الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل يمكن حفظ الرسومات المرسومة بواسطة SurfaceView ؟

بدأه محمد فضل في 12 فبراير 2012 · 8 رد · 723 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عند استخدام surfaceView لانشاء الرسومات عوضا عن view هل يمكن حفظ تلك الرسومات على هيئة bitmap بالرغم من أن Bitmap bitmap = object.getDrawingCache(); لا تعمل مع surfaceview

هل هناك حل لهذه المشكلة ؟؟

رب ارحمهما كما ربياني صغيرا

#3

هذا المثال أخي .S.T.A.L.K.E.R يستخدم الـ view العادية وانا استخدم surfaceView يبدو أن هناك اختلافا بينهما

لك جزيل الشكر على تفاعلك الدائم

لا حرمك الله الأجر

رب ارحمهما كما ربياني صغيرا

#4

لا يا اخي

الموضوع نفسه الذي تبحث عنه

 Bitmap bitmap = Bitmap.createBitmap(240, 320, Bitmap.Config.ARGB_4444);
                Canvas canvas = new Canvas(bitmap);
                /**
                 * Draw on your Canvas
                 */

                FileOutputStream fileOutputStream=new FileOutputStream(new File(path));
                bitmap.compress(CompressFormat.JPEG, 90, fileOutputStream);

ال Canvas هو نفسه المستخدم بال SurfaceView

#5

جزاك الله خيرا أخي ولكن حين استخدمت هذه الطريقة الجهاز يقول أن البرنامج لا يستجيب

:/

رب ارحمهما كما ربياني صغيرا

#6

عالاكيد لن يستجيب معك

اذا كنت تستخدم هذا الكود خلال الThread Run

#7

اخي العزيز جزاك الله خيرا على هذه الردود الكافية و الوافية ولقد اقفت عمل thread ثم قمت بحفظ الصورة ولكن ايضا الصورة خالية .. هل يمكن أن تشرح الطريقة العامة لعمل surface view حتى تتضح لي الفكرة و بارك الله فيك

رب ارحمهما كما ربياني صغيرا

#9
package com.harktat.mohamed;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.R.color;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.Paint.Join;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class SegnatureActivity extends Activity implements OnTouchListener {
	/** Called when the activity is first created. */

	ourSurface object;
	Path myPath;
	float startX, startY, finalX, finalY;
	Thread myThread = null;
	Canvas myCanvas;
	SurfaceHolder myHolder;
	Paint myPaint;

	Bitmap saveIcon, deleteIcon, unlockIcon;

	Bitmap originalBitmap ;
	boolean canIDraw = false;
	boolean needToDraw = false;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		object = new ourSurface(this);
		object.setOnTouchListener(this);
		object.setDrawingCacheEnabled(true);
		setContentView(object);
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		object.pause();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		object.resume();
	}

	public class ourSurface extends SurfaceView implements Runnable {

		public ourSurface(Context context) {
			super(context);
			// TODO Auto-generated constructor stub

			myPath = new Path();
			myHolder = getHolder();


		}

		public void run() {
			// TODO Auto-generated method stub

			while (canIDraw) {

				if (!myHolder.getSurface().isValid()) {
					continue;
				}
				myCanvas = myHolder.lockCanvas();
				myCanvas.drawColor(Color.BLACK);
				drawMyBasicShapes();
				myCanvas.drawPath(myPath, myPaint);
				myHolder.unlockCanvasAndPost(myCanvas);

			}
		}

		public void pause() {

			canIDraw = false;
			while (true) {
				try {
					myThread.join();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				myThread = null;
				break;
			}
		}

		public void resume() {

			canIDraw = true;
			myThread = new Thread(this);
			myPaint = new Paint();
			myPaint.setColor(Color.LTGRAY);
			myPaint.setStyle(Style.STROKE);
			myPaint.setStrokeCap(Cap.ROUND);
			myPaint.setStrokeJoin(Join.ROUND);
			myPaint.setStrokeWidth(2);

			saveIcon = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(
					getResources(), R.drawable.save_icon), 50, 50, true);
			deleteIcon = Bitmap.createScaledBitmap(BitmapFactory
					.decodeResource(getResources(), R.drawable.delete_icon),
					50, 50, true);
			unlockIcon = Bitmap.createScaledBitmap(BitmapFactory
					.decodeResource(getResources(), R.drawable.unlock), 50, 50,
					true);


		}

		@Override
		protected void onSizeChanged(int w, int h, int oldw, int oldh) {
			// TODO Auto-generated method stub
			super.onSizeChanged(w, h, oldw, oldh);
			originalBitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);
			myCanvas = new Canvas(originalBitmap);			
			myThread.start();

		}

		public void drawMyBasicShapes() {

			Paint basicsPaint = new Paint();
			int canvasH, canvasW;

			canvasH = myCanvas.getHeight();
			canvasW = myCanvas.getWidth();

			basicsPaint.setColor(Color.DKGRAY);
			basicsPaint.setStyle(Style.STROKE);
			basicsPaint.setStrokeWidth(4);

			myCanvas.drawLine(0, canvasH - 60, canvasW, canvasH - 60,
					basicsPaint);
			myCanvas.drawBitmap(saveIcon, 0, canvasH - 50, null);
			myCanvas.drawBitmap(deleteIcon, canvasW - 50, canvasH - 50, null);

		}
	}

	public boolean onTouch(View v, MotionEvent event) {

		float xPosition, yPosition;

		xPosition = event.getX();
		yPosition = event.getY();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			if (yPosition < object.getHeight() - 60) {
				startX = xPosition;
				startY = yPosition;
				myPath.moveTo(startX, startY);
			} else {
				if (xPosition > 0 && xPosition < saveIcon.getWidth()) {
					this.setTitle("save");
					saveMySignature();
				} else if (xPosition > object.getWidth()
						- deleteIcon.getWidth()) {
					this.setTitle("delete");
				}
			}

			break;

		case MotionEvent.ACTION_MOVE:

			if (yPosition < object.getHeight() - 60) {

				finalX = xPosition;
				finalY = yPosition;
				if (finalX != startX && finalY != startY) {

					myPath.quadTo(startX, startY, finalX, finalY);
				}
				startX = finalX;
				startY = finalY;

				break;
			}
		}

		return true;
	}

	public void saveMySignature() {

		canIDraw = false;
		while (true) {
			try {
				myThread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			myThread = null;
			break;
		}

		try {
			String path = Environment.getExternalStorageDirectory()
					.getAbsolutePath();

			File file = new File(path + "/segnature.png");
			if (!file.exists()) {
				file.createNewFile();

			}

			FileOutputStream fos;
			fos = new FileOutputStream(file);
			originalBitmap.compress(CompressFormat.PNG, 100, fos);
			this.setTitle("image saved");
			fos.flush();
			fos.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		 } 

	}
}

رب ارحمهما كما ربياني صغيرا

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…