بهینه سازی نمای سفارشی

هنگامی که یک نمای خوب طراحی شده دارید که به حرکات و انتقال بین حالت ها پاسخ می دهد، مطمئن شوید که نما سریع اجرا می شود. برای جلوگیری از UI که در حین پخش احساس کندی می کند یا لکنت دارد، مطمئن شوید که انیمیشن ها به طور مداوم با سرعت 60 فریم در ثانیه اجرا می شوند.

دید خود را تسریع کنید

برای افزایش سرعت مشاهده، کدهای غیر ضروری را از روتین هایی که به طور مکرر فراخوانی می شوند حذف کنید. با onDraw() شروع کنید که بیشترین بازپرداخت را به شما می دهد. به طور خاص، تخصیص‌ها را در onDraw() حذف کنید، زیرا تخصیص‌ها ممکن است منجر به جمع‌آوری زباله شود که باعث لکنت می‌شود. تخصیص اشیا در حین مقداردهی اولیه یا بین انیمیشن ها. هرگز در حین اجرای یک انیمیشن، تخصیصی انجام ندهید.

علاوه بر نازک‌تر کردن onDraw() ، مطمئن شوید که تا حد امکان به ندرت فراخوانی شود. اکثر فراخوان‌های onDraw() نتیجه یک فراخوانی برای invalidate() است، بنابراین فراخوان‌های غیرضروری برای invalidate() را حذف کنید.

یکی دیگر از عملیات بسیار پرهزینه، پیمایش طرح‌بندی‌ها است. هنگامی که یک view requestLayout() فرا می خواند، سیستم رابط کاربری Android کل سلسله مراتب view را طی می کند تا بفهمد که هر نما چقدر باید بزرگ باشد. اگر اندازه گیری های متناقضی پیدا کند، ممکن است چندین بار سلسله مراتب را طی کند. طراحان UI گاهی اوقات سلسله مراتب عمیقی از اشیاء تو در تو ViewGroup ایجاد می کنند. این سلسله مراتب نمای عمیق باعث مشکلات عملکردی می شود، بنابراین سلسله مراتب دید خود را تا حد امکان کم عمق کنید.

اگر رابط کاربری پیچیده ای دارید، برای اجرای طرح بندی آن، یک ViewGroup سفارشی بنویسید. برخلاف نماهای داخلی، نمای سفارشی شما می‌تواند فرضیات خاص برنامه را در مورد اندازه و شکل فرزندان خود ایجاد کند و بنابراین از عبور از فرزندان خود برای محاسبه اندازه‌گیری‌ها اجتناب می‌کند.

به عنوان مثال، اگر یک ViwGroup سفارشی دارید که اندازه خود را برای تناسب با همه نماهای فرزند خود تنظیم نمی کند، از هزینه های اضافی برای اندازه گیری همه نماهای فرزند خودداری می کنید. اگر از طرح‌بندی‌های داخلی استفاده کنید که طیف وسیعی از موارد استفاده را برآورده می‌کنند، این بهینه‌سازی ممکن نیست.

،

هنگامی که یک نمای خوب طراحی شده دارید که به حرکات و انتقال بین حالت ها پاسخ می دهد، مطمئن شوید که نما سریع اجرا می شود. برای جلوگیری از UI که در حین پخش احساس کندی می کند یا لکنت دارد، مطمئن شوید که انیمیشن ها به طور مداوم با سرعت 60 فریم در ثانیه اجرا می شوند.

دید خود را تسریع کنید

برای افزایش سرعت مشاهده، کدهای غیر ضروری را از روتین هایی که به طور مکرر فراخوانی می شوند حذف کنید. با onDraw() شروع کنید که بیشترین بازپرداخت را به شما می دهد. به طور خاص، تخصیص‌ها را در onDraw() حذف کنید، زیرا تخصیص‌ها ممکن است منجر به جمع‌آوری زباله شود که باعث لکنت می‌شود. تخصیص اشیا در حین مقداردهی اولیه یا بین انیمیشن ها. هرگز در حین اجرای یک انیمیشن، تخصیصی انجام ندهید.

علاوه بر نازک‌تر کردن onDraw() ، مطمئن شوید که تا حد امکان به ندرت فراخوانی شود. اکثر فراخوان‌های onDraw() نتیجه یک فراخوانی برای invalidate() است، بنابراین فراخوان‌های غیرضروری برای invalidate() را حذف کنید.

یکی دیگر از عملیات بسیار پرهزینه، پیمایش طرح‌بندی‌ها است. هنگامی که یک view requestLayout() فرا می خواند، سیستم رابط کاربری Android کل سلسله مراتب view را طی می کند تا بفهمد که هر نما چقدر باید بزرگ باشد. اگر اندازه گیری های متناقضی پیدا کند، ممکن است چندین بار سلسله مراتب را طی کند. طراحان UI گاهی اوقات سلسله مراتب عمیقی از اشیاء تو در تو ViewGroup ایجاد می کنند. این سلسله مراتب نمای عمیق باعث مشکلات عملکردی می شود، بنابراین سلسله مراتب دید خود را تا حد امکان کم عمق کنید.

اگر رابط کاربری پیچیده ای دارید، برای اجرای طرح بندی آن، یک ViewGroup سفارشی بنویسید. برخلاف نماهای داخلی، نمای سفارشی شما می‌تواند فرضیات خاص برنامه را در مورد اندازه و شکل فرزندان خود ایجاد کند و بنابراین از عبور از فرزندان خود برای محاسبه اندازه‌گیری‌ها اجتناب می‌کند.

به عنوان مثال، اگر یک ViwGroup سفارشی دارید که اندازه خود را برای تناسب با همه نماهای فرزند خود تنظیم نمی کند، از هزینه های اضافی برای اندازه گیری همه نماهای فرزند خودداری می کنید. اگر از طرح‌بندی‌های داخلی استفاده کنید که طیف وسیعی از موارد استفاده را برآورده می‌کنند، این بهینه‌سازی ممکن نیست.