طراحی UI (نسخه جدید برنامه)
لطفا نسخه جدید رو دانلود کنید و نظرتون رو بگید. هنوز یکسری باگ داره، از هر گونه نظر در مورد UX,UI ، نرم کار کردن انیمیشن ها و ... استقبال میشه. پیشاپیش ممنون از نظراتتون دوستان عزیز
لینک نسخه جدید
سلام دوستان
در زیر لینک برنامه ایه که من چند روزه دارم طراحی میکنم.
این برنامه شامل یک Actionbar هست که سایزش با اسکرول تغییر میکنه.
سناریو برنامه به صورتی هست که کاربر وقتی متن رو اسکرول میکنه برای این که فضای بیشتری برای خوندن متن داشته باشه Actionbar کوچک میشه.
تنها مشکلی که 2 راه حل براش دارم ولی نمیدونم کدوم اصولی تره زمانیه که کاربر صفحه اول رو اسکرول میکنه و میره به صفحه دومه، در این صورت بالای صفحه دوم خالی میمونه، کاری که من میخوام بکنم شبیه GooglePlayGames هست (روی یک بازی که کلیک میکنید صفحه مورد نظر رو میبینید)، توی گوگل پلی گیمز 3 عدد Fragment وجود داره که وقتی جابجا میشن اسکرول به طور کامل Handle میشه.
.
راه حل هایی که به فکرم رسیده:
1: مانند گوگل پلی ViewPager رو ببرم بالا
2: اسکرول شدن رو هندل کنم(کار خیلی سخت و زمان بریه و با کوچکترین تغییر در آینده همه چی نابود میشه)
مشکلات روش ها:
روش اول: قبلا لیست ویو رو جابجا کردم و برنامه شدیدا Lag گرفت، اگر ویو پیجر رو جابجا کنم Lag نداره؟ به هر حال کسی که این کار رو کرده گوگل هست و میتونن از خیلی چیزا استفاده کرده باشن.
روش دوم: اگر یک لیست از لیستنر ها تعریف کنم و در کلاس UiMoveHelper که جابجایی هارو انجام میدم با اسکرول شدن بگم همه لیست ویو هایی که onViewCreated برمیگردونه رو ببر بالا 2 تا مشکل داره، 1 اینکه فقط باید به اندازه Actionbar بره بالا، 2 اینکه Fragment شماره 3 که ساخته نشده که نمیره بالا.
خلاصه شرمنده که سرتون رو درد اوردم.ممنون میشم برنامه رو دانلود کنید و مشکلم رو ببینید.
javac جان من دارم طرح گوگل رو پیاده سازی میکنم. البته اون آیکون کتاب ایده خودم بود و پیاده سازیش خیلی برام سخت بود.گوگل هم یک نمونه ساده از این رو ساخته ولی فقط از پایین صفحه کمی میاد بالا و بعد دوباره میره پایین
روش ساخت اکشن بار به این صورت هست که من یک اکشن بار 2 لایه دارم که لایه هارو با انجام اسکرول روی RecycleView بالا میبرم.اون اعداد که گوگل بهشون میگه Tab یک Indicator هستند که اون هم با اسکرول بالا میره.انیمیشن ها هم با ObjectAnimator ست شدن و آیتم ها هم توی CardView خود گوگل هستن.
ویو پیجر زیرش نمیتونه حرکت کنه چون حرکتش باعث Lag میشه پس ViewPager رو بزرگتر ساختم و در آداپتر RecycleView یک type خالی تعریف کردم که آیتم های RecycleView از ابتدا نشون داده بشن.
اینا فقط قسمت Layout ها و طراحی ظاهری بود.در مورد کد هم میتونم بگم همه چیز داینامیکه
من یک کلاس UiMoveHelper دارم که زمانی که از فرگمنت میخوام چیزی رو جابجا کنم باید از اکتیویتی مورد نظر View ها رو بگیرم و بعد دوباره به همون اکتیویتی بگم که به UiMoveHelper دستور بده که عملیات جابجایی رو انجام بده.
شرمنده اگر یکم پیچیده توضیح دادم خودمم یکم هنگ کردم.
زمانی که از ViewPager استفاده میکنیم، نمیتونیم به فرگمنت ها تگ اختصاص بدیم چون خود ViewPager به صورت اتوماتیک اینکار رو انجام میده.البته حتما باید آداپتر فرگمنت از نوع FragmentPagerAdapter باشه وگرنه تگ درست نمیشه و null برمیگردونه.
این روش برای کسانی به درد میخوره که میخوان با کلیک بر یک دکمه در همه فرگمنت ها تغییر ایجاد کنن.(من میخوام با اسکرول شدن یک RecyclerView همه RecyclerView ها اسکرول بشن)
مرحله اول: ارسال فرگمنت جاری به اکتیویتی :
برای ارسال یک متد پابلیک در اکتیویتی ایجاد میکنیم که فقط و فقط یک ورودی از نوع Fragment که در ایمپورت ها باید import android.support.v4.app.Fragment; باشد میگیریم و از توی فرگمنت اون رو Call میکنیم.
مشکل من توی مقایسه تگ ها این بود که من یک FragmentMain میگرفتم. (FragmentMain نام کلاس فرگمنت من بود)
مرحله دوم:ارسال فرگمنت ها و ذخیره آنها:
زمانی که از FragmentPagerAdapter استفاده میکنیم همه فرگمنت ها توی استک ذخیره میشن و حذف نمیشن، پس ما یک لیست از فرگمنت ها داریم که کم نمیشن.
توی اکتیویتی یک از ArrayList از فرگمنت ها درست میکنیم و یک متد مینویسیم که ورودی Fragment بگیره و به لیست اضافه کنه.
توی onViewCreated در کلاس فرگمنتمون میایم این تابع رو کال میکنیم که فرگمنتی که ساخته شده در این لیست اضافه بشه.
(حتما باید چک کنیم که قبلا توی لیست نبوده باشه مگرنه فاجعه رخ میده(در پایین طریقه تشخیص گفته میشه))
مرحله سوم: مقایسه فرگمنت ها:
من خیلی سرچ کردم ولی راهی براش پیدا نکردم، پس یک راه جدید میسازیم.
در صورتی که فرگمنت های ما تعدادشون کمتر از 10 عدد باشن همیشه آخرین کاراکتر تگ میشه ایندکس فرگمنت.
ایندکس فرگمنت جاری رو هم میشه از ViewPager دریافت کرد.
پس در اکتیویتی متدی که بالا نوشتیم رو کامل میکنیم. یک حلقه درست میکنیم که به تعداد ArrayList ی که ساختیم دونه دونه تگ فرگمنت های ArrayList رو با فرگمنتی که به متد ارسال شده مقایسه میکنیم، اگر True برگردوند یک متغیر که خارج از حلقه تعریف کردیم رو مساوی i یا همون شمارنده قرار میدیم.
اینجا ما تونستیم id فرگمنت جاری رو بگیریم، پس میگیم فرگمنت بعدی و قبلی اون عمل اسکرول رو انجام بدن، و فرگمنت های بعدی هم در onCreateView باید مقدار اسکرول شده رو بگیرن و خودشون رو تطبیق بدن.
توضیح: زمانی که اسکرول میشد همه فرگمنت ها میومدن اسکرول میکردن و RecyclerView میترکید.برای همین ما باید فرگمنتی که داره اسکرول میکنه پیدا کنیم و بعد بگیم بعدی و قبلیش عمل اسکرول رو انجام بدن.
اگر هر بخشی از کد هارو خواستید میتونم در اختیارتون بذارم دوستان، ولی کل پروژه رو، چون در شرکت ایران اپز نوشته شده نمیتونم ارسال کنم، لطفا همچین چیزی ازم نخواید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .