View Full Version : چگونه به آیتم ها در لیست ویو افکت بدهیم
dktetki
چهارشنبه 17 اردیبهشت 1393, 01:57 صبح
سلام دوستان چگونه باید افکت داد به آیتمهایی که در لیست ویو نمایش داده میشن
poorman
چهارشنبه 17 اردیبهشت 1393, 02:59 صبح
میخواین وقتی لیست اسکرول میشه با انیمیشن بیان آیتم ها ؟
این فایل xml رو توی پوشه anim درست کنید ( slide_in_right.xml )
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" >
<translate
android:duration="200"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>
بعدش توی آداپتر لیست ویو این انیمیشن رو به آیتم هاتون بدید ( مثل کد زیر تقریبا )
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
v = vi.inflate(R.layout.simple_list_item_1, null);
}
ListData o = list.get(position);
TextView tt = (TextView) v.findViewById(R.id.toptext);
tt.setText(o.content);
Log.d("ListTest", "Position : "+position);
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_top_to_bottom);
v.startAnimation(animation);
return v;
}
NeoFighT
چهارشنبه 17 اردیبهشت 1393, 12:37 عصر
چطور میشه تشخیص داد که اسکرول به سمت پایین شده یا سمت بالا؟:متفکر:
poorman
چهارشنبه 17 اردیبهشت 1393, 12:58 عصر
چطور میشه تشخیص داد که اسکرول به سمت پایین شده یا سمت بالا؟:متفکر:
به سختی :لبخند:
شما باید از متد onScrollStateChanged استفاده کنی برای لیست ویو
نتیجه رو توی یک متغیر عمومی ذخیره کنی و توی آداپتر چک کنی اگر به سمت پایین بود فلان بشه اگه بالا بود فلان بشه
private int mLastFirstVisibleItem;
public boolean mIsScrollingUp;
public void onScrollStateChanged(AbsListView view, int scrollState) {
final ListView lw = getListView();
if (view.getId() == lw.getId()) {
final int currentFirstVisibleItem = lw.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem) {
mIsScrollingUp = false;
} else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
mIsScrollingUp = true;
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
NeoFighT
چهارشنبه 17 اردیبهشت 1393, 13:32 عصر
متد onScrollStateChanged رو کجا باید بنویسی ؟ :لبخند:
poorman
چهارشنبه 17 اردیبهشت 1393, 13:56 عصر
توی اکتیویتی دیگه به لیستتون set میکنید
NeoFighT
چهارشنبه 17 اردیبهشت 1393, 15:26 عصر
درست کار نکرد قاطی میکنه
متد onScrollStateChanged رو تو MyAdapter پیاده سازی کردم.
poorman
چهارشنبه 17 اردیبهشت 1393, 15:39 عصر
من الان امتحان کردم شد
این تابع رو توی اکتیویتی بنویسید
private OnScrollListener onScrollList = new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
final ListView lw = (ListView) view;
if (view.getId() == lw.getId()) {
final int currentFirstVisibleItem = lw.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem) {
mIsScrollingUp = false;
view.setBackgroundColor(Color.YELLOW);
} else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
mIsScrollingUp = true;
view.setBackgroundColor(Color.WHITE);
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
};
بعد از ست کردن آداپتر توی اکتیویتی این کد رو بنویسید
list.setOnScrollListener(onScrollList);
smemamian
چهارشنبه 17 اردیبهشت 1393, 20:55 عصر
میخواین وقتی لیست اسکرول میشه با انیمیشن بیان آیتم ها ؟
این فایل xml رو توی پوشه anim درست کنید ( slide_in_right.xml )
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" >
<translate
android:duration="200"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>
بعدش توی آداپتر لیست ویو این انیمیشن رو به آیتم هاتون بدید ( مثل کد زیر تقریبا )
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
v = vi.inflate(R.layout.simple_list_item_1, null);
}
ListData o = list.get(position);
TextView tt = (TextView) v.findViewById(R.id.toptext);
tt.setText(o.content);
Log.d("ListTest", "Position : "+position);
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_top_to_bottom);
v.startAnimation(animation);
return v;
}
تشکر از پاسختون.
ولی توجه کردید دارید به ازای هر Scroll یا بهتر بگم، به ازای هر itemی که شما
به کاربر نمایش می دهید یک Object از کلاس Animation می سازید ؟
برای مثال اگر صفحه ای 15 Item رو نشان می دهد، 15 بار این شیء در
حافظه قرار می گیره و GC مجبور به پاک کردن این شیء ها میشه !!!
راه حل بهتر :
در سازنده، Animation رو مقداردهی کنید و از یک بار شیء اون کلاس
استفاده کنید.
نکته: در این صورت کمی از زیبایی Scroll کردن کاسته می شود.
abbasalim
جمعه 02 خرداد 1393, 21:46 عصر
تشکر از پاسختون.
ولی توجه کردید دارید به ازای هر Scroll یا بهتر بگم، به ازای هر itemی که شما
به کاربر نمایش می دهید یک Object از کلاس Animation می سازید ؟
برای مثال اگر صفحه ای 15 Item رو نشان می دهد، 15 بار این شیء در
حافظه قرار می گیره و GC مجبور به پاک کردن این شیء ها میشه !!!
نکته gc دندش نرم چشمشم کور وظیفشه انجام بده :گیج:
NeoFighT
جمعه 02 خرداد 1393, 23:40 عصر
اگه بعد از هر بار استفاده شی رو پاک کنیم چی؟
یعنی اینطوری
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
v = vi.inflate(R.layout.simple_list_item_1, null);
}
ListData o = list.get(position);
TextView tt = (TextView) v.findViewById(R.id.toptext);
tt.setText(o.content);
Log.d("ListTest", "Position : "+position);
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_top_to_bottom);
v.startAnimation(animation);
animation = null;
return v;
}
smemamian
جمعه 02 خرداد 1393, 23:55 عصر
بحث پاک کردن شیء نیست چون خود سیستم داره این کار رو انجام
میده، بحث ساخت تعداد شیء هاست.
pouya1999best@g
شنبه 03 خرداد 1393, 13:10 عصر
میخواین وقتی لیست اسکرول میشه با انیمیشن بیان آیتم ها ؟
این فایل xml رو توی پوشه anim درست کنید ( slide_in_right.xml )
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" >
<translate
android:duration="200"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>
بعدش توی آداپتر لیست ویو این انیمیشن رو به آیتم هاتون بدید ( مثل کد زیر تقریبا )
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
v = vi.inflate(R.layout.simple_list_item_1, null);
}
ListData o = list.get(position);
TextView tt = (TextView) v.findViewById(R.id.toptext);
tt.setText(o.content);
Log.d("ListTest", "Position : "+position);
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_top_to_bottom);
v.startAnimation(animation);
return v;
}
لطفا سورسو بزارید.خیلی پیچیدس
NeoFighT
شنبه 03 خرداد 1393, 14:02 عصر
بحث پاک کردن شیء نیست چون خود سیستم داره این کار رو انجام
میده، بحث ساخت تعداد شیء هاست.
آخه اگه شی رو یک بار ایجاد و مقدار دهی کنیم(همان طوری که گفتید)
انیمیشن ها بهم میریزن و فایده نداره.
poorman
شنبه 03 خرداد 1393, 14:58 عصر
لطفا سورسو بزارید.خیلی پیچیدس
والا اگر با لیست ویو و آداپتر کار کرده باشید باید راحت متوجه بشید
فایل انیمیشن رو که توی پوشه anim درست میکنید و کاری نداره
بعدش توی آداپتر لیست ویوتون، توی متد getView این 2 تا خط مربوط به انیمیشن رو اضافه میکنید
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_top_to_bottom);
v.startAnimation(animation);
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.