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

عارض صور بسيط

بدأه علاء الصالحي في 24 سبتمبر 2009 · 20 رد · 1,917 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف حالكم جميعاً وما أخبار العيد معكم

لي فترة أحاول أن أطور حزمة المحرك AAnimation

ولا يخفى عليكم أن هذا النوع من البرمجة

-أقصد برمجة الحزم packages لا البرمجة باستخدام حزمتي-

تحتاج إلى اختبار من قبل المستخدمين وأخذ التغذية الراجعة feedback من قبل المطورين

وبما أن الجميع يعتبرني مجرد مدعي

قررت أن أكون أنا أول المستخدمين لحزمتي

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

ابدأ أولاً مع الفئة ImagePanel

هذه الفئة تمثل صورة موضوعة في panel

أفكر في أن أضيفها إلى حزمة أدواتي MyComponents في نسختها القادمة بإذن الله

لكني أحتاج إلى تطويرها بعض الشيء

package imageViewer;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {
	private BufferedImage image;
	private Image scalledImage;
	private final URL resource;
	private double currentAngle;
	private boolean changeInRotationAngle;

	public ImagePanel(String imageURI) {
		//System.out.println(imageURI); 
		resource = getClass().getResource(imageURI);
	}

	public boolean isScalledImageCreated(int width, int height) {
		return scalledImage != null && scalledImage.getHeight(null) == height
		&& scalledImage.getWidth(null) == width;

	}

	public void createThumpnail(int width, int height)
			throws MalformedURLException, IOException {
		if (image == null)
			loadImage();
		if (isScalledImageCreated(width, height))
			return;
		scalledImage = image.getScaledInstance(width, height,
				Image.SCALE_SMOOTH);
		// System.out.println("create thumpnail");
		repaint();
		// setBounds(0, 0, width, height);
		// setBounds(0, 0, image.getWidth(), image.getHeight());
	}

	public void loadImage() throws MalformedURLException, IOException {
		image = ImageIO.read(resource);
		// System.out.println("load image");
	}

	public void setRotateAngle(double degree) {
		double tempAngle = degree%360;
		if(currentAngle==tempAngle)
			return;
		currentAngle=tempAngle;
		repaint();
	}

	public void addToRotateAngle(double degree){
		currentAngle=((degree%360)+currentAngle)%360;
		repaint();
		//System.out.println(currentAngle);
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d=(Graphics2D)g;
		// System.out.println("enter paint image");
		if (scalledImage == null) {
			return;
		}
		 super.paintComponent(g);
		 AffineTransform origXform = g2d.getTransform();
		 AffineTransform newXform = (AffineTransform)(origXform.clone());
		 //center of rotation is center of the panel
		 int xRot = this.getWidth()/2;
		 int yRot = this.getHeight()/2;
		 newXform.rotate(Math.toRadians(currentAngle), xRot, yRot);
		 g2d.setTransform(newXform);
		 //draw image centered in panel
		 int x = (getWidth() - image.getWidth(this))/2;
		 int y = (getHeight() - image.getHeight(this))/2;
		 g.drawImage(scalledImage, 0, 0, scalledImage.getWidth(null),
					scalledImage.getHeight(null), null);
		 g2d.setTransform(origXform);


		// System.out.println("paint image");
		// g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(),null);
	}

}

مميزات الفئة السابقة

1- تمكنك من تصغير الصورة إلى الحجم الذي تريده بالضبط وتضعها في منتصف الحاوية panel

2- تمكنك من تدوير الصورة بأي زاوية تريد

3- تمكنك من تحميل الصورة في الذاكرة عند الحاجة فقط lazy initialization

الفئة ImageAnimation وهذه الفئة تقوم ببناء الواجهة AnimationListner

المسؤولة عن الأحداث في الحزمة AAnimation

package imageViewer;

import version8.AnimationEvent;
import version8.AnimationListEvent;
import version8.AnimationListner;

public class ImageAnimation implements AnimationListner {
	private int count;

	public void beforeAnimationList(
			AnimationListEvent animationListEvent) {

		//System.out.println("before animation lsit");
	}

	public void beforeAnimation(AnimationEvent animationEvent) {
		// TODO Auto-generated method stub

	}

	public void afterAnimationList(
			AnimationListEvent animationListEvent) {
		// TODO Auto-generated method stub

	}

	public void afterAnimation(AnimationEvent animationEvent) {
		if(!animationEvent.getAnimationObject().isAnimationObjectWakeOutOfAnimationEngineContatiner()){
			count++;
		}
		else
			count--;

		if(count==0||count==animationEvent.getAnimationList().getLength()){
			animationEvent.getAnimationObject().setList(null);
		}

		//System.out.println(count);
	}
}

الفئة الأخيرة وهي الفئة عارض الصور

package imageViewer;

import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

import version8.AnimationEngine;
import version8.AnimationEvent;
import version8.AnimationList;
import version8.AnimationListEvent;
import version8.AnimationListner;
import version8.AnimationObject;
import version8.WhenAnimationObjectReachBoundsOfAnimationEngineContainer;
import version8.script.PointToPointAnimation;

public class ImageViewer extends JPanel implements ActionListener {

	// private List<ImagePanel> imagePanels;
	public static final int constatnt = 20;
	private AnimationEngine animationEngine;
	private List<AnimationObject> animationObjects = new ArrayList<AnimationObject>();
	private JLayeredPane layerdPane = new JLayeredPane();
	private int currentImageIndex = 0;
	private JButton previousButton, nextButton;
	private AnimationList forwordAnimationList2;
	private AnimationList backwordAnimationList2;


	public ImageViewer(int width, int height, boolean lazyIntialization,List<ImagePanel> imagePanels) 
		throws MalformedURLException,IOException {

		intializeEnimationEngine();
		boolean first = true;
		int i = 0;

		for (ImagePanel imagePanel : imagePanels) {
			i++;
			first = createAnimationObject(width, height, lazyIntialization,
					first, i, imagePanel);
		}

		intialization(width,height);
	}

	public ImageViewer(int width, int height, boolean lazyIntialization,ImagePanel... imagePanels) 
	throws MalformedURLException,IOException {

		intializeEnimationEngine();
		boolean first = true;
		int i = 0;

		for (ImagePanel imagePanel : imagePanels) {
			i++;
			first = createAnimationObject(width, height, lazyIntialization,
					first, i, imagePanel);
		}

		intialization(width,height);
	}

	private boolean createAnimationObject(int width, int height,boolean lazyIntialization, boolean first, int i,ImagePanel imagePanel)
		throws MalformedURLException, IOException {
		AnimationObject animationObject;

		if (first) {
			animationObject = new AnimationObject(new Point(constatnt, 0),imagePanel, null, false);
			animationObject.setBounds(0, 0, width - constatnt * 2, height);
			first = false;
		}
		else {
			animationObject = new AnimationObject(new Point(width- constatnt, 0), imagePanel, null, false);
			animationObject.setBounds(width - constatnt * 2, 0, width- constatnt * 2, height);
		}

		layerdPane.add(imagePanel, new Integer(i));

		if (!lazyIntialization) {
			imagePanel.createThumpnail(imagePanel.getWidth(), imagePanel.getHeight());
			imagePanel.repaint();
		}
		//animationObject.setActionWhenAnimationObjectReachBoundsOfAnimationEngineContatin
er(WhenAnimationObjectReachBoundsOfAnimationEngineContainer.IGNORE_ALL_REJECTED
_ANIMATION);
		animationObject.addAnimationListner(new ImageAnimation());
		animationObjects.add(animationObject);
		animationEngine.addAnimationObject(animationObject);
		return first;
	}

	private void intializeEnimationEngine() {
		animationEngine = new AnimationEngine(layerdPane);
		animationEngine.setAutoActiviate(false);
		new Thread(animationEngine).start();
	}

	private void intialization(int width,int height)throws MalformedURLException, IOException {
		ImagePanel imagePanel = (ImagePanel) animationObjects.get(0).getComponent();
		imagePanel.createThumpnail(width, height);
		setLayout(null);
		setBounds(0, 0, height, width);
		intializePanel(width, height);
		intializeAnimationList();
		intializePreviousButton(height);
		intializeNextButton(width, height);
	}

	private void intializeNextButton(int width, int height) {
		nextButton = new JButton(">");
		nextButton.setBounds(width - constatnt, 0, constatnt, height);
		if (currentImageIndex == animationObjects.size() - 1) {
			nextButton.setEnabled(false);
		}
		nextButton.addActionListener(this);
		add(nextButton);
	}

	private void intializePreviousButton(int height) {
		previousButton = new JButton("<");
		previousButton.setBounds(0, 0, constatnt, height);
		previousButton.setEnabled(false);
		previousButton.addActionListener(this);
		add(previousButton);

	}

	private void intializeAnimationList() {
		forwordAnimationList2 = new PointToPointAnimation(-layerdPane.getWidth(), 0,0, 0, 1000).excute();
		backwordAnimationList2 = new PointToPointAnimation(0, 0, -layerdPane.getWidth(), 0, 1000).excute();
	}

	private void intializePanel(int width, int height) {
		layerdPane.setLayout(null);
		layerdPane.setBounds(constatnt, 0, width - constatnt * 2, height);
		add(layerdPane);
	}

	private void next() throws MalformedURLException, IOException {
		System.out.println("hello method");
		currentImageIndex++;
		final ImagePanel imagePanel = (ImagePanel) animationObjects.get(currentImageIndex).getComponent();
		if(!imagePanel.isScalledImageCreated(imagePanel.getWidth(), imagePanel.getHeight())){
			new Thread(new Runnable() {

				public void run() {

					try {
						imagePanel.createThumpnail(imagePanel.getWidth(), imagePanel.getHeight());
					} catch (MalformedURLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					if (currentImageIndex == animationObjects.size() - 1) {
						nextButton.setEnabled(false);
					}
					else
						nextButton.setEnabled(true);

					previousButton.setEnabled(true);// any time method next calling then
					animationObjects.get(currentImageIndex).setList(backwordAnimationList2);
					animationEngine.activeEngine();
				}
			}).start();
			System.out.println("hello if");
		}
		else{
			//currentImageIndex++;
			//imagePanel.createThumpnail(imagePanel.getWidth(), imagePanel.getHeight());
			if (currentImageIndex == animationObjects.size() - 1) {
				nextButton.setEnabled(false);
			}
			else
				nextButton.setEnabled(true);

			previousButton.setEnabled(true);// any time method next calling then
			animationObjects.get(currentImageIndex).setList(backwordAnimationList2);
			animationEngine.activeEngine();
			System.out.println("hello else");
		}
	}

	private void previous() throws MalformedURLException, IOException {
		currentImageIndex--;
		ImagePanel imagePanel = (ImagePanel) animationObjects.get(currentImageIndex).getComponent();
		imagePanel.createThumpnail(imagePanel.getWidth(), imagePanel.getHeight());

		if (currentImageIndex == 0) {
			previousButton.setEnabled(false);
		}
		else
			previousButton.setEnabled(true);

		nextButton.setEnabled(true);// any time method previous calling then
		animationObjects.get(currentImageIndex + 1).setList(forwordAnimationList2);
		animationEngine.activeEngine();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == nextButton) {
			try {
				next();
			} catch (MalformedURLException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		} else if (e.getSource() == previousButton) {
			try {
				previous();
			} catch (MalformedURLException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Image Viewer Test");
		frame.setLayout(null);
		try {
			ImagePanel comp1 = new ImagePanel("1.jpg");
			ImagePanel comp2 = new ImagePanel("2.jpg");
			ImagePanel comp3 = new ImagePanel("3.jpg");
			ImagePanel comp4 = new ImagePanel("4.jpg");
			ImagePanel comp5 = new ImagePanel("5.jpg");
			ImagePanel comp6 = new ImagePanel("6.bmp");
			ImagePanel comp7 = new ImagePanel("7.jpg");
			ImagePanel comp8 = new ImagePanel("8.jpg");

			ArrayList<ImagePanel> imagePanels = new ArrayList<ImagePanel>();
			imagePanels.add(comp1);
			imagePanels.add(comp2);
			imagePanels.add(comp3);
			imagePanels.add(comp4);
			imagePanels.add(comp5);
			imagePanels.add(comp6);
			imagePanels.add(comp7);
			imagePanels.add(comp8);
			ImageViewer viewer = new ImageViewer(450, 450, true, imagePanels);
			viewer.setBounds(17, 7, 450, 450);
			frame.add(viewer);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		frame.setSize(500, 500);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

تحدثت عن موضوع JLayeredPane في لمحة الصراع الطبقي

لست جيداً في شرح ما أقوم به

لذا أي أسئلة سأكون جاهز إن شاء الله

شيء أخير قبل أن أختم لاحظت بطء في تحميل الصور ولا أعرف كيف أحل هذه المشكلة

هل لدى أحدكم حل لها؟

أظن أن للأمر علاقة بموضوع ClassLoader

تحياتي

imageViewer.rar

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#2

فعلا برنامج جميل

ممكن تضيف radioButton في الأسفل لاختيار مسار الجركة، هل من اليسار إلى اليمين أو العكس، هل من فوق إلى تحت أو فوق

من قال أنك مدعي :mad:

هناك نقطة لم أفهمها، وهي لماذا عملت rotate داخل الpaintComponent في الكلاس ImagePanel؟؟

بالنسبة للتأخير في تحميل الصور، فهو يحدث فقط في المرة الأولى، بسبب أنك تعمل createThumpnail داخل الactionPerformed، وهذا يؤخر ظهور الصورة. ممكن تنادي لهذه الميثود على كل ImagePanel داخل الconstructor وهكذا ستكون كل الصور محملة، وفي الميثود next تقتصر على عمل الحركة بدون تحميل الصور

#3

ماشاء الله عنك يا علاء , فعلا حركة الصورة كتير جذابة و جميلة , لكن هل ممكن تغير الحركة مثلا من أعلى لأسفل أو بشكل دائري مثلا .. ؟؟!!

وإن كان ذلك , فإنه يضع لك أساسيات بناء البرامج التفاعلية و التي تشبه مثلا برنامج PowerPoint

موفق يا علاء

#4

السلام عليكم

لم انجح في تشغيل البرنامج

سويت compile لل version8 واضفته لل jdk

وعند تشغيل ال ImageViewer

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
		at javax.imageio.ImageIO.read(ImageIO.java:1362)
		at ImagePanel.loadImage(ImagePanel.java:48)
		at ImagePanel.createThumpnail(ImagePanel.java:36)
		at ImageViewer.intialization(ImageViewer.java:105)
		at ImageViewer.<init>(ImageViewer.java:51)
		at ImageViewer.main(ImageViewer.java:249)
#5
الحرازي كتب:
السلام عليكم

لم انجح في تشغيل البرنامج

سويت compile لل version8 واضفته لل jdk

وعند تشغيل ال ImageViewer

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
		 at javax.imageio.ImageIO.read(ImageIO.java:1362)
		 at ImagePanel.loadImage(ImagePanel.java:48)
		 at ImagePanel.createThumpnail(ImagePanel.java:36)
		 at ImageViewer.intialization(ImageViewer.java:105)
		 at ImageViewer.<init>(ImageViewer.java:51)
		 at ImageViewer.main(ImageViewer.java:249)

لان البرنامج لم يستطع تحديد مكان تخزين الصور المراد عرضها , لذلك يجب عليك وضعها في نفس مجلد المشروع

#6
اقتباس
لان البرنامج لم يستطع تحديد مكان تخزين الصور المراد عرضها , لذلك يجب عليك وضعها في نفس مجلد المشروع

شكرا جزيلا، اشتغل :D

البرنامج جميل جدا.

سأحاول دراسة الحزمة بتمعن. هل يوجد decumentaion خاص بها اخ علاء؟

وشكرا

#7

بالنسبة لعملية التدوير فأنا استعمل مفهوم decomposition & composition

وقد استخدمت هذه الفئة في إنشاء المثال الخاص بالسيارة في الموضوع الأًصلي وسأضعها بإذن الله قريباً

لهذا تجدها موجودة هنا :)

قمت بها يا عصام لكني لا أعرف لماذا بقيت المشكلة

تلاحظ حتى أني فمت بوضع خيط Thread جديد عند عملية التحميل

لكن لا حياة لمن تنادي

يبقى الموضوع بأول ظهور للصورة على الشاشة

أريد حلاً :(

أخ محمد بالنسبة للحركة من أعلى لأسفل يمكننا ذلك بسهولة

لكن بالنسبة للدوران لم أفهم ما تقصد بالضبط

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

رائع يا علاء ....

#9

لا تكفي رائع يا عثمان

أريد نقداً يحركني ويجعلني أقوم بشيء جديد

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

افففففففففففففففففففف

كتبت مشاركة وكبست اضافة و لكن الاشارة الويرلس كانت مختفية و ذهب الرد سدى

اعيده في مرة لاحقة

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#11
اقتباس
كتبت مشاركة وكبست اضافة و لكن الاشارة الويرلس كانت مختفية و ذهب الرد سدى

اعيده في مرة لاحقة

:hot:

وفي المرة الاحقة لا تنسا تغير المتصفح :angry:

اقتباس
شيء أخير قبل أن أختم لاحظت بطء في تحميل الصور ولا أعرف كيف أحل هذه المشكلة

هل لدى أحدكم حل لها؟

أظن أن للأمر علاقة بموضوع ClassLoader

اقتباس
بالنسبة للتأخير في تحميل الصور، فهو يحدث فقط في المرة الأولى، بسبب أنك تعمل createThumpnail داخل الactionPerformed، وهذا يؤخر ظهور الصورة. ممكن تنادي لهذه الميثود على كل ImagePanel داخل الconstructor وهكذا ستكون كل الصور محملة، وفي الميثود next تقتصر على عمل الحركة بدون تحميل الصور

يعني بعد التنفيذ لاول صورة ممكن نحذف مجلد الصور من المشروع ويبقا يستعرض الصور عادي حتى لو مو موجودة ؟

يعني على مقولة الراوي انه تاخذ بالذاكرة دون مسار حقيقي ؟؟!

موفق يا علاء

الله معكم

#12
رامي العيساوي كتب:
افففففففففففففففففففف

كتبت مشاركة وكبست اضافة و لكن الاشارة الويرلس كانت مختفية و ذهب الرد سدى

اعيده في مرة لاحقة

:haha: :haha: :haha: :haha: :haha: :haha: :haha: :haha: :haha:

:haha: :haha: :haha: :haha: :haha: :haha: :haha: :haha: :haha:

#13

أخي الحزاري اعذرني فلم انتبه لمشاركتك

لأني كنت أكتب ردي وقت كتابتك لردك

بأمانة لا يوجد توثيق سوى ما أكتبه في المدونة في النسخ الخاصة بالحزمة

لست بارعاً في كتابة التوثيق

بل وأظنني سيء أيضاً

وطبعاً ولأني أتكلم عن مشروع مفتوح المصادر

فالأمر عائد لي بالكلية

لذا لن تروا توثيقاً ما دمت انا من يقوم بتطوير الحزمة :lol:

على كل لا أظن أن التوثيق يفيد أحداً لأني الوحيد الذي يستخدمها

وبما أني أنا كاتب الحزمة

فلست بحاجة لأي توثيق

بالنسبة لرامي

لا دخل لي أنا

مشاكلك مع الحجة وايرلس لا تعنيني في شيء

أعد كتابة ردك وضعه هنا

أصلح في المناصب الإدارية :lol:

بإمكانك جعلها كذلك وبإمكانك جعلها تتحمل عند الحاجة لها

وذلك من خلال المدخل lazyInitialization في صانع الكائنات الخاص بعارض الصور

بقي رد محمد

محمد لم تخبرني عن موضوع الحركة الدائرية ما الذي تعنيه بالضبط

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#14
اقتباس
بإمكانك جعلها كذلك وبإمكانك جعلها تتحمل عند الحاجة لها

وذلك من خلال المدخل lazyInitialization في صانع الكائنات الخاص بعارض الصور

مممممممممم

قمت بحذف الصور بعد تشغيل الفورم وما زالت استعرض الصور

لربما مثلا عندما نكون نستعرض صورة ونأتي لنحذفها من مسار استعراضنا ضهر لنا الرسالة الجميلة للوندوز

" لا يمكن حذف الملف او نقله ما زال قيد الاستخدام "

قد اخرج عن الموضوع لكن سؤالي انو في اي قسم من عارض الصور الخاص ب lazyInitialization نستطيع ان نعدل هذه الخاصية

لانو الكود كبير وما فهمت شي :blush:

بس عم بفهمو ها مو انو مو عم بفهمو :happy:

فعلا التنقل بين الصور فيه نوع من ال requset time out يعني تقطيشة

عندي حل ! انو تستخدم الحركة الدورانية الي قال علها محمد بس لهلا ما عرفتها :)

انتظر ردك على القسم الذي سالتك عنه

بالتوفيق

الله معك

#15

تستطيع التعديل في Constructor الخاص بعارض الصور

قم بتغيير القيمة true إلى false

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#16

السلام عليكم

تحية طيبة لكم جميعا ولما تقدمون

أخوي علاء وجميع الاعزاء حملت الملف ولم أرى سوى بعض الصور وثلاثة ملفات بامتداد java

هل هناك مشكلة ام لابد من تشغيل البرنامج من خلال مشغل الجافا

واذا كان الامر كذلك فلدي نسخه من برنامج JBuiler

فهل اجد لديكم شرح لطريقة تشغيل البرامج من خلالة

ودمتم بكل خير

أبو دانة

تم تعديل هذه المشاركة بواسطة أبو دانه في 16 أكتوبر 2009 في 12:28

#17

ليس برنامجاً بالمعنى الحرفي

على كل لو أردت سأرفع لك المشروع على هيئته في eclipse

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#19
علاء الصالحي كتب:
ليس برنامجاً بالمعنى الحرفي

على كل لو أردت سأرفع لك المشروع على هيئته في eclipse

تحياتي

حسنا بانتظاره اخي...

بارك الله فيك

#20

البرنامج ممتاز أخ علاء ويعرض عضلات AAnimation بشكل ممتاز :-) .. لكن هناك عيب واحد وهو عدم وجود تعليقات في الحزمة أو على الأقل في مستعرض الصور ، حاولت تتبع البرنامج ، أريد أن أعرف كيف يعمل ( مستواي مش ولابد في الجافا ) ، لكن أصطدم بعدة متغيرات وmethods لا أعرف فائدتها .. لم أجد تعليق واحد في البرنامج ..

لذلك فكرة كتابة تعليق ولو بسيط يجعل الفائدة أكبر :-) ..

بالتوفيق أخوي .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#21

بالتوفيق أخي و من أفضل لأفضل بإذن الله

تحياتي ..

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