View Full Version : افزودن و حذف کردن ایمیج ویو در زمان اجرا
فاطمه وطن دوست
دوشنبه 25 آبان 1394, 21:35 عصر
سلام
من میخوام در زمان اجرا با لمس دکمه امکا اضافه کردن به تعداد نامحدود ایمیج تو صفحه وجود داشته باشه.
و کاربر هر موقع خواست اون ایمیج رو حذف کنه.
--/// ذخیره مکان
میخوام مکان اون ایمیج تو صفحه رو هم ذخیره و بازیابی کنم.
لطفا راهنمائی کنید.
-- > فرض کنید یه دایره داریم کاربر میخواد داخل دایره رو با تعداد تصویر پر کنه.
( کاربر بعد از اضافه کردن ) تعدادی دلخواه ایمیج بتونه اونو تو صفحه حرکت بده و در دایره بچینه و در انتها مکان اون عکس ذخیره بشه.
android2015
دوشنبه 25 آبان 1394, 22:36 عصر
یک کلاس به نام ClipArt بسازید و کد زیر رو داخلش کپی کنید:
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class ClipArt extends RelativeLayout {
int baseh;
int basew;
int basex;
int basey;
ImageButton btndel;
ImageButton btnrot;
ImageButton btnscl;
RelativeLayout clip;
Context cntx;
boolean freeze = false;
int h;
int i;
ImageView image;
String imageUri;
boolean isShadow;
int iv;
RelativeLayout layBg;
RelativeLayout layGroup;
RelativeLayout.LayoutParams layoutParams;
public LayoutInflater mInflater;
int margl;
int margt;
float opacity = 1.0F;
Bitmap originalBitmap;
int pivx;
int pivy;
int pos;
Bitmap shadowBitmap;
float startDegree;
String[] v;
public ClipArt(Context paramContext) {
super(paramContext);
cntx = paramContext;
layGroup = this;
basex = 0;
basey = 0;
pivx = 0;
pivy = 0;
mInflater = ((LayoutInflater) paramContext.getSystemService("layout_inflater"));
mInflater.inflate(R.layout.clipart, this, true);
btndel = ((ImageButton) findViewById(R.id.del));
btnrot = ((ImageButton) findViewById(R.id.rotate));
btnscl = ((ImageButton) findViewById(R.id.sacle));
layoutParams = new RelativeLayout.LayoutParams(250, 250);
layGroup.setLayoutParams(layoutParams);
image = ((ImageView) findViewById(R.id.clipart));
image.setImageResource(R.drawable.ic_launcher);
setOnTouchListener(new View.OnTouchListener() {
final GestureDetector gestureDetector = new GestureDetector(ClipArt.this.cntx,
new GestureDetector.SimpleOnGestureListener() {
public boolean onDoubleTap(MotionEvent paramAnonymous2MotionEvent) {
return false;
}
});
public boolean onTouch(View paramAnonymousView, MotionEvent event) {
if (!ClipArt.this.freeze) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
layGroup.invalidate();
gestureDetector.onTouchEvent(event);
layGroup.performClick();
basex = ((int) (event.getRawX() - layoutParams.leftMargin));
basey = ((int) (event.getRawY() - layoutParams.topMargin));
break;
case MotionEvent.ACTION_MOVE:
int i = (int) event.getRawX();
int j = (int) event.getRawY();
layBg = ((RelativeLayout) getParent());
if ((i - basex > -(layGroup.getWidth() * 2 / 3))
&& (i - basex < layBg.getWidth() - layGroup.getWidth() / 3)) {
layoutParams.leftMargin = (i - basex);
}
if ((j - basey > -(layGroup.getHeight() * 2 / 3))
&& (j - basey < layBg.getHeight() - layGroup.getHeight() / 3)) {
layoutParams.topMargin = (j - basey);
}
layoutParams.rightMargin = -1000;
layoutParams.bottomMargin = -1000;
layGroup.setLayoutParams(layoutParams);
break;
}
return true;
}
return true;
}
});
this.btnscl.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint({ "NewApi" })
public boolean onTouch(View paramAnonymousView, MotionEvent event) {
if (!ClipArt.this.freeze) {
int j = (int) event.getRawX();
int i = (int) event.getRawY();
layoutParams = (RelativeLayout.LayoutParams) layGroup.getLayoutParams();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ClipArt.this.layGroup.invalidate();
ClipArt.this.basex = j;
ClipArt.this.basey = i;
ClipArt.this.basew = ClipArt.this.layGroup.getWidth();
ClipArt.this.baseh = ClipArt.this.layGroup.getHeight();
int[] loaction = new int[2];
layGroup.getLocationOnScreen(loaction);
margl = layoutParams.leftMargin;
margt = layoutParams.topMargin;
break;
case MotionEvent.ACTION_MOVE:
float f2 = (float) Math.toDegrees(Math.atan2(i - ClipArt.this.basey, j - ClipArt.this.basex));
float f1 = f2;
if (f2 < 0.0F) {
f1 = f2 + 360.0F;
}
j -= ClipArt.this.basex;
int k = i - ClipArt.this.basey;
i = (int) (Math.sqrt(j * j + k * k)
* Math.cos(Math.toRadians(f1 - ClipArt.this.layGroup.getRotation())));
j = (int) (Math.sqrt(i * i + k * k)
* Math.sin(Math.toRadians(f1 - ClipArt.this.layGroup.getRotation())));
k = i * 2 + ClipArt.this.basew;
int m = j * 2 + ClipArt.this.baseh;
if (k > 150) {
layoutParams.width = k;
layoutParams.leftMargin = (ClipArt.this.margl - i);
}
if (m > 150) {
layoutParams.height = m;
layoutParams.topMargin = (ClipArt.this.margt - j);
}
ClipArt.this.layGroup.setLayoutParams(layoutParams );
ClipArt.this.layGroup.performLongClick();
break;
}
return true;
}
return ClipArt.this.freeze;
}
});
this.btnrot.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint({ "NewApi" })
public boolean onTouch(View paramAnonymousView, MotionEvent event) {
if (!ClipArt.this.freeze) {
layoutParams = (RelativeLayout.LayoutParams) ClipArt.this.layGroup.getLayoutParams();
ClipArt.this.layBg = ((RelativeLayout) ClipArt.this.getParent());
int[] arrayOfInt = new int[2];
layBg.getLocationOnScreen(arrayOfInt);
int i = (int) event.getRawX() - arrayOfInt[0];
int j = (int) event.getRawY() - arrayOfInt[1];
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ClipArt.this.layGroup.invalidate();
ClipArt.this.startDegree = layGroup.getRotation();
ClipArt.this.pivx = (layoutParams.leftMargin + ClipArt.this.getWidth() / 2);
ClipArt.this.pivy = (layoutParams.topMargin + ClipArt.this.getHeight() / 2);
ClipArt.this.basex = (i - ClipArt.this.pivx);
ClipArt.this.basey = (ClipArt.this.pivy - j);
break;
case MotionEvent.ACTION_MOVE:
int k = ClipArt.this.pivx;
int m = ClipArt.this.pivy;
j = (int) (Math.toDegrees(Math.atan2(ClipArt.this.basey, ClipArt.this.basex))
- Math.toDegrees(Math.atan2(m - j, i - k)));
i = j;
if (j < 0) {
i = j + 360;
}
ClipArt.this.layGroup.setRotation((ClipArt.this.st artDegree + i) % 360.0F);
break;
}
return true;
}
return ClipArt.this.freeze;
}
});
this.btndel.setOnClickListener(new View.OnClickListener() {
public void onClick(View paramAnonymousView) {
if (!ClipArt.this.freeze) {
layBg = ((RelativeLayout) ClipArt.this.getParent());
layBg.performClick();
layBg.removeView(ClipArt.this.layGroup);
}
}
});
}
public void disableAll() {
this.btndel.setVisibility(4);
this.btnrot.setVisibility(4);
this.btnscl.setVisibility(4);
}
public ImageView getImageView() {
return this.image;
}
public void setFreeze(boolean paramBoolean) {
this.freeze = paramBoolean;
}
}
کد Layout :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<ImageButton android:id="@+id/rotate" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:adjustViewBounds="true" android:background="@android:color/transparent" android:scaleType="fitCenter" android:src="@drawable/rotation"/>
<ImageButton android:id="@+id/sacle" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:adjustViewBounds="true" android:background="@android:color/transparent" android:scaleType="fitCenter" android:src="@drawable/pointer"/>
<ImageButton android:id="@+id/del" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:adjustViewBounds="true" android:background="@android:color/transparent" android:scaleType="fitCenter" android:src="@drawable/close"/>
<ImageView android:id="@+id/clipart" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"/>
</RelativeLayout>
برای اضافه کردن ایمیج ویو هم از کد زیر استفاده کنید:
int count = 1000;
RelativeLayout Design_Layout = (RelativeLayout) findViewById(R.id.Design_Layout);
ClipArt ca = new ClipArt(MainActivity.this);
Design_Layout.addView(ca);
ca.setId(count++);
ca.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "Selected Item Id : " + v.getId(), Toast.LENGTH_LONG).show();
}
});
public void disableall() {
for (int i = 0; i < Design_Layout.getChildCount(); i++) {
if (Design_Layout.getChildAt(i) instanceof ClipArt) {
((ClipArt) Design_Layout.getChildAt(i)).disableAll();
}
}
}
یا می تونید این سورس رو دانلود کنید:
http://ravikoradiya.com/android/StickerDemo/StickerDemo.zip
http://stackoverflow.com/a/33207136
فاطمه وطن دوست
جمعه 29 آبان 1394, 00:48 صبح
مشکل حل شد.
فاطمه وطن دوست
شنبه 30 آبان 1394, 01:36 صبح
سلام
من میخوام مکان قرار گیری هر ایمیل ویو رو تو صفحه توسط shareprefrences ذخیره کنم.
موقع اضافه کردن ایمیج بهشون ای دی یا تگ دادم.
ولی کد خطا دارد و نمیتونم x . Y هر ایمیج ویو ی که به صورت دینامیک تو صفحه هست رو بهش دسترسی داشته باشم و ذخیره کنم.
کدهامو قرار میدم.
این کدهاست و ولی خطا میده ... با آی دی هم که سرچ می کنم بین ویوها خطا داد.
int totalid = main.getChildCount();
SharedPreferences shared = getSharedPreferences("Prefs", MODE_PRIVATE);
String sTag;
k = 0;
for (int c = 0; c <= totalid; c++) {
sTag = String.valueOf(view.findViewById(++c).getTag());
if (sTag == "btn" + String.valueOf(++c)) {
x1[k] = view.findViewById(++c).getX();
y1[k] = view.findViewById(++c).getY();
k++;
SharedPreferences.Editor editor = shared.edit();
editor.putFloat("x" + k, x1[k]);
editor.apply();
}
}
android2015
شنبه 30 آبان 1394, 18:42 عصر
برای دسترسی به مشخصات شی اضافه شده به لایوت، می تونید از کد زیر استفاده کنید:
RelativeLayout Design_Layout = (RelativeLayout) findViewById(R.id.Design_Layout);
String Object_Value = null;
for (int i = 0; i < Design_Layout.getChildCount(); i++) {
Object_Value =
":Tag:" + Design_Layout.getChildAt(i).getTag() + "\n" +
":X:" + Design_Layout.getChildAt(i).getX() + "\n" +
":Y:" + Design_Layout.getChildAt(i).getY() + "\n"+
":Width:" + Design_Layout.getChildAt(i).getWidth() + "\n" +
":Height:" + Design_Layout.getChildAt(i).getHeight() + "\n" +
":Rotation:" + Design_Layout.getChildAt(i).getRotation() + "\n"
;
if(Design_Layout.getChildAt(i).getTag().equals("Text"))
{
TextView txt = (TextView) Design_Layout.getChildAt(i).findViewById(R.id.text );
Object_Value = Object_Value + "\n" +
":Text:" + txt.getText() + "\n" +
":TextColors:" + txt.getCurrentTextColor() + "\n" +
":TextSize:" + txt.getTextSize() ;
}
}
Log.i("Object_Value","" + Object_Value);
فاطمه وطن دوست
دوشنبه 02 آذر 1394, 00:02 صبح
برای جا به جا کردن شی مورد نظر در صفحه باید از onTouch , onDrag باید استفاده کنم درسته ؟
متغیر flag فقط برای اینه که من تو رویداد setOnClickListener دکمه حذف میکنم. یه تفاوت بین رویدادها باشه.
میدونم کدم چیزی نداره. ممنون میشم راهنمایی کنید.
دکمه ها داخل لاینر افقی قرار دارن.
در صورتیکه من میخوام دکمه ها بتونن تو کل اکتیویتی حرکت کنن.در ضمن تو صفحه یه ایمیج دارم که قراره کاربر این دکمه ها ( تصاویر) رو داخل اون تصویر بچینه.
btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_MOVE){
flag=false;
view.setVisibility(View.INVISIBLE);
return true;
} else {
flag = true ;
return false;
}
}
});
btn.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
float currX,currY;
int action = event.getAction();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// do nothing
break;
case DragEvent.ACTION_DRAG_ENTERED:
// do nothing
break;
case DragEvent.ACTION_DRAG_EXITED:
// do nothing
break;
case DragEvent.ACTION_DROP:
v.setVisibility(View.VISIBLE);
v.setX(event.getX());
v.setY(event.getY());
break;
default:
break;
}
return true;
}
});
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.