<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mahan PoorYazdanKhah</title>
        <link>https://virgool.io/feed/@mahanpyk</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 13:44:06</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/24736/avatar/avatar.png?height=120&amp;width=120</url>
            <title>Mahan PoorYazdanKhah</title>
            <link>https://virgool.io/@mahanpyk</link>
        </image>

                    <item>
                <title>نئومورفیسم (Neumorphism) در اندروید</title>
                <link>https://virgool.io/@mahanpyk/neumorphism-jivgxmjxeiui</link>
                <description>نئومورفیسم (Neumorphism)من از اواخر سال گذشته چندین پست در مورد طراحی نئومورفیسم دیده‌ام. من شخصا به یک طرح جدید علاقمند هستم، بنابراین می‌خواستم آن را به اندروید انجام دهم. با این حال، من نمی‌توانستم کتابخانه را به خاطر محدودیت‌های پلتفرم پیدا کنم. پس من آن را ساده کردم. (پروژه گیت‌هاب)من این مقاله را برای به اشتراک گذاشتن کتابخانه و دریافت بازخورد بیشتر نوشتم.قبل از شروع، برخی از شما ممکن است با واژه نئومورفیسم ناآشنا باشید. این یک مفهوم رابط کاربری مانند متریال دیزان است و در ترسیم سایه‌ها متفاوت است. اگر می‌خواهید بیشتر در مورد نئومورفیسم بدانید، این مقاله را بخوانید.در متریال دیزاین سطوح هنگامی که مانع نور می‌شوند، سایه ایجاد می‌کنند.در نئومورفیسم، ابجکت ها از زیر پس‌زمینه بیرون آمدن و ظاهر می‌شوند.ویجت نئومورفیسمچگونه از آن استفاده کنیم؟استفاده کردن از آن ساده است. دو سایه در سمت چپ بالا و پایین بکشید. سایه باید به آرامی پخش شود. پس با استفاده ازRenderScript، سایه‌ها را محو کنید.با این حال، صرفا به کار بردن آن باعث بروز مشکلات می‌شود. اگر شما سایه را در خارج از ناحیه دید رسم کنید، سایه قطع می‌شود.خراب شدن سایهابتدا، من سعی کردم از android:clipChilderen=&quot;false&quot; در root استفاده کنم. با این حال، بسته به نسخه سیستم‌عامل و یا در برخی از ViewGroup مانند  RelativeLayout، ویژگی به درستی کار نمی‌کند، بنابراین مشکل به طور کامل حل نگردیده است.پس در نهایت با استفاده از android:padding آن را حل کردم. برای جلب نظر این ویژگی در این منطقه، padding را به درستی تنظیم کنید.افکت فشار دادنمهم است که رابط کاربری سیار زیبا به نظر برسد. افکت فشار دادن مانند دادن دکمه هم مهم هستند. چگونه می‌توانم اثر فشار دکمه را در نئومورفیسم به دست بیاورم؟اولین چیزی که به ذهن می‌رسد این است که چگونه شکل را به طور متفاوت با توجه به رویداد نشان دهد. این در واقع روشی است که برخی از مردم پیشنهاد کرده‌اند. متاسفانه، تعاملات در این روش به اندازه کافی طبیعی نیستند.override fun onTouchEvent(event: MotionEvent): Boolean {
 when (event.action) {
        MotionEvent.ACTION_DOWN -&gt;
            setShapeType(ShapeType.PRESSED)
        MotionEvent.ACTION_UP -&gt;
            setShapeType(ShapeType.FLAT)
    }
   return super.onTouchEvent(event)
}استفاده از StateListAnimator مثل دکمه متریال است؟ اگر سایه را با توجه بهTranslationZ حرکت دهید، اثر فشار دکمه به طور طبیعی نشان داده خواهد شد.شروع به کارمن با توجه به آنچه تا کنون درباره آن صحبت کرده ایم یک کتابخانه ساختم. این روش اجزای نمایش مانند CardView، Button و ImageView را ارائه می‌دهد.نحوه استفاده از کتابخانه:&lt;soup.neumorphism.NeumorphCardView
    style=&amp;quot@style/Widget.Neumorph.CardView&amp;quot&gt;    &lt;ConstraintLayout&gt;
        ...
    &lt;/ConstraintLayout&gt;&lt;/soup.neumorphism.NeumorphCardView&gt;انجام شد! (از XML استفاده کنید بهتر است)بعد از آن اجازه دهید ببینیم که ویجت‌ها چه خصوصیاتی فراهم می‌کند.سایهشما می‌توانید رنگ و ارتفاع سایه را تنظیم کنید.&lt;soup.neumorphism.NeumorphCardView
 app:neumorph_shadowElevation=&amp;quot6dp&amp;quot
 app:neumorph_shadowColorLight=&amp;quot@color/light_color&amp;quot
 app:neumorph_shadowColorDark=&amp;quot@color/dark_color&amp;quot /&gt;شکلشما می‌توانید شکل سطح و گوشه‌ها را تغییر دهید.&lt;soup.neumorphism.NeumorphCardView
    app:neumorph_shapeType=&amp;quot{flat|pressed|basin}&amp;quot
    app:neumorph_shapeAppearance=&amp;quot@style/ShapeAppearance&amp;quot /&gt;&lt;style name=&amp;quotShapeAppearance&amp;quot&gt;
    &lt;item name=&amp;quotneumorph_cornerFamily&amp;quot&gt;{rounded|oval}&lt;/item&gt;
    &lt;item name=&amp;quotneumorph_cornerSize&amp;quot&gt;32dp&lt;/item&gt;
&lt;/style&gt;ویجت‌های مختلف نئومورفیسمرنگشما می‌توانید پس‌زمینه و رنگ مرزی این نما را مشخص کنید.&lt;soup.neumorphism.NeumorphCardView
 app:neumorph_backgroundColor=&amp;quot@color/background_color&amp;quot
 app:neumorph_strokeColor=&amp;quot@color/stroke_color&amp;quot
 app:neumorph_strokeWidth=&amp;quot@dimen/stroke_width&amp;quot /&gt;انتخاب رنگ برای ویجت‌های نئومورفیسمPaddingدر اخر، ویژگی padding برای جلوگیری از بریده شدن سایه پشتیبانی می‌شود. این ویژگی به صورت پیش فرض دارای مقدار 12 است.&lt;soup.neumorphism.NeumorphCardView
 android:padding=&amp;quot12dp&amp;quot /&gt;البته، همه ویژگی‌ها را می توان به صورت دستی تغییر داد.و در پیاده‌سازی Drawable نوشته شده ‌است. به همین راحتی می توان همان عملکرد را به چندین نمایش اعمال کرد. بنابراین به راحتی می توان آن را به CustomView اعمال کرد.ما دیده‌ایم که چگونه می توانیم نئومورفیسم را بر روی پلتفرم اندروید اجرا کنیم و چگونه از کتابخانه آن استفاده کنیم.من فکر می‌کنم، طراحی جدید یک ایده جالب برای توسعه دهندگان است. نئومورفیسم احساس جدیدی به من می‌دهد و اجرای آن نیز سرگرم‌ کننده است.با این حال، در مقایسه با متریال دیزاین، نئومورفیسم حوزه‌های بسیاری دارد که در آن اصول طراحی واضح نیستند. به عبارت دیگر، اگر چه اجرا شد، من فکر می‌کنم هنوز هم برای تولید آن کافی نیست.بنابراین اگر شما به نئومورفیسم علاقمند هستید، سعی کنید از کتابخانه به عنوان آزمایشی استفاده کنید. لطفا در مورد هر چیزی در کتابخانه توضیح دهید. (به این ویژگی خوش آمدید!) برای رسیدن به سطح مطلوب، نظرات مختلفی مورد نیاز است. https://github.com/fornewid/Neumorphism شما می توانید اصل این مقاله رو در اینجا مطالعه کنید. من فقط مقاله رو ترجمه کردم و اینجا در اختیار شما قرار دادم</description>
                <category>Mahan PoorYazdanKhah</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Sun, 22 Nov 2020 19:10:42 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت برنامه‌های نیتیو در iOS و Android</title>
                <link>https://virgool.io/devAndroid/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%87%D8%A7%DB%8C-%D9%86%DB%8C%D8%AA%DB%8C%D9%88-%D8%AF%D8%B1-ios-%D9%88-android-gaxg2hai9lhu</link>
                <description>برای طراحی بهترین اپ‌های نیتیو، شما باید تفاوت بین پلتفرم‌های iOS و اندروید را بدانید. این سیستم عامل‌ها نه تنها از نظر برنامه‌های نیتیو متفاوتند، بلکه از لحاظ ساختاری نیز متفاوت می‌باشند. شما باید این تفاوت‌ها را در نظر داشته باشید تا بتوانید بهترین تجربه کاربری (UX) را از طریق طراحی اپلیکیشن نیتیو خود ارائه دهید.نیتیو اپلیکیشن‌های موبایل برای iOS و Android دارای ویژگی‌های خاص عملکردی اجرایی هستند. داکیومنت‌های Apple و Google توصیه می‌کنند که سیستم عامل کنترل استاندارد راهبری را هرزمانی که ممکن است استفاده کنید : کنترل صفحات، نوار صفحه، کنترل بخش، جدول نمایش‌ها، کالکشن ویو، و اسپیلیت ویو.کاربرها با چگونگی کار این کنترل‌ها روی هر سیستم عامل را میدانند بنابراین اگر شما از استاندارد کنترل استفاده کنید، کاربران شما مستقیما میفهمند که چطور به اپ شما دست پیدا کنند. ما روی تفاوت‌های اصلی بین اثر متقابل الگوهای طراحی روی iOS و Android برای توضیح اینکه چگونه اپ‌ها روی iOS و Android متفاوت دیده می‌شوند یا اینکه چگونه باید متفاوت دیده شوند تمرکز کنیم. همچنین ما الگوهای طراحی نیتیو اپ و نمونه‌های نیتیو اپلیکشتن موبایل را ارائه میدهیم تا به تجسم درباره انچه میخواهیم صحبت کنیم، کمک کنیم.تفاوت در الگوهای ناوبری(Navigation)تفاوت الگوهای راهبردی بین صفحات در حال حرکت یک عملکرد رایج در اپلیکیشن‌های موبایل هستند. توجه به اینکه iOS و Android دارای راهنماهای طراحی نیتیو اپ متفاوت به هنگام تبدیل به الگوهای راهبردی هستند مهم است. در قسمت پایینی دستگاه‌های Android یک نوار راهبردی جهانی وجود دارد. استفاده از دکمه پشتی در نوار راهبری راه ساده ای برای برگشتن به صفحه یا قدم قبلی است ، و این تقریبا در تمامی اپ‌های Android کارایی دارد.Global navigation bar (Android) از طرف دیگر نوار راهبری جهانی Android، در رویکرد طراحی Apple مقداری متفاوت است. نوار راهبری در اپل وجود ندارد، بنابراین ما در طراحی نیتیو اپ iOS نمی‌توانیم با استفاده از یک دکمه پشتی به عقب برگردیم. که این کار مسبب طراحی اپلیکیشن‌های موبایل iOS میشود. صفحات درونی باید یک نوار نیتیو راهبردی همراه با یک دکمه پشتی در گوشه چپ قسمت بالایی داشته باشند.Back button (iOS) همچنین Apple شامل یک حالت ضربه‌ای از چپ به راست در اپلیکیشن‌های که به صفحه قبل میروند میشود. این ویژگی تقریبا در تمامی اپ‌ها کارایی داردLeft-to-right swiping gesture — go back (iOS) تفاوت بین iOS و Android در این زمینه این هست که دستگاه های iOS حالت ضربه ای چپ به راست شما را به صفحه قبل برمیگرداند. همان حالت در دستگاه های Android نوارها را جابجا میکند. اما در تفاوت با iOS، یک نوار راهبردی در قسمت پایین همراه با دکمه پشتی در دستگاه‌های اندروید وجود دارد که شما را به صفحه قبل برمیگرداند.همیشه مهم است که تفاوت بین سیستم عامل با سایر اپلیکیشن‌های موبایل درارتباط با ثبات همیشگی را بدانید.Left-to-right swiping gesture — switch between tabs (Android) الگوهای راهبردی داخلی اپ در iOS و Android متفاوت هستندتعداد اختیارات راهبردی کمی در راهنماهای متریال دیزاین وجود دارد. یکی از معروف‌ترین الگوهای راهبردی در اپلیکیشن‌های اندروید تلفیقی از نوارها و یک دراور (Drawer) راهبردی است.دراور راهبری یک منو است که به صورت کشویی با فشار دادن آیکون منو همبرگر از چپ به راست انجام میشود. نوارها در قسمت پایین عنوان صفحه سمت راست قرار دارد و حجم سازماندهی را در لول بالاتر فراهم میکند و به کاربران اجازه میدهد تا بین نمایه‌ها یا صفحه‌های کاربردی یک اپ جابجا شوند.Left — drawer navigation menu; right — tabs (Material Design) همچنین در متریال دیزاین یک جزء بنام راهبرد تحتانی (Bottom navigation) وجود دارد. این جزء همچنین برای یک متریال دیزاین نیتیو اپ دارای اهمیت است. نوارهای راهبرد تحتانی برای جستجو و جابجایی بین نمایش‌های تاپ لول در یک تک ضربه کار راه راحت میکنند. راهنماهای متریال دیزاین استفاده همزمان از راهبرد تحتانی و نوارها را توصیه نمی‌کنند زیرا باعث آشفتگی در حین راهبرد میشود.Bottom navigation (Material Design) در راهنماهای Apple هیچ کنترل راهبرد استانداردی که مشابه منو دراور راهبرد باشد نداریم. در عوض، راهنماهای Appleقراردادن راهبری جهانی را در نوار ابزار توصیه میکند. نوارابزار در قسمت پایینی صفحه اپ قرار دارد و توانایی جابجایی سریع بین قسمتهای مختلف اپ را تامین میکند.معمولا، نوار ابزار حاوی بیشتر از ۵ مقصد نیست. همانطور که ما می‌توانیم ببینیم، این اجزا شبیه راهبرد تحتانی در متریال دیزاین هستند اما اکثرا در اپ‌های iOS مورد استفاده قرار میگیرند.Top left — iOS segmented control; bottom right — iOS tab bar (HIG) اگرچه عوامل مشابهی عملکردهای یکسانی در دو سیستم اجرا میکنند (نوارها و سگمنت کنترل، راهبرد تحتانی و نوار ابزار)، راهبری هنوز یکی از تفاوت‌های اصلی بین iOS و Android هستند. تفاوت‌های عینی در هردو وجود دارد، مانند نوار راهبری جهانی در Android و کمبود آن در iOS، همانند تفاوت‌های تصویری از این دو سیستم.اپل معتقد است که عوامل راهبری باید در پیش نما باشد و منوی همبرگر باید تنها برای ذخیره عملکردهایی که اجرای کاربردی روزانه توسط کاربرها ندارند استفاده میشوند. از طرف دیگر این امر رایج است که راهبری اولیه در منوی همبرگر در اپلیکیشنهای اندروید مخفی شوند.نمایش‌های سفارشی برای کنترل‌های استاندارد خواهان زمان توسعه یافته اضافی است و برای کاربران ناشناس استاگر شما می‌خواهید هر عامل در اپلیکیشن شما شبیه آن طرف سیستم عامل باشد، شما نیازمند تلاش توسعه یافته‌ای برای ساخت بهترین طراحی موبایل هستید. پیچیده‌ترین موارد استفاده شامل کنترل‌های دیفالت مانند دکمه‌های رادیو ، چک باکس‌ها، ضامن‌ها، و غیره که خواهان یک اجرای نمایش سفارشی برای نشان دادن کنترل‌های مشابه iOS روی اندورید یا کنترل های مشابه اندروید روی iOS.هر سیستم عامل فعل و انفعالات خاص خود را دارد. بهترین طراحی، طراحی‌ای است که عادات کاربر را در هر سیستم اجرایی مورد نظر داشته باشد. به یاد داشتن تفاوت‌های بین سیستم عامل‌ها به هنگام طراحی یک اپلیکیشن موبایل برای iOS و Android مهم است بنابراین شما اپلیکیشن‌هایی را که توقعات کاربران را برطرف میکند طراحی می‌کنید.یک نمونه از عاملی که بطور نمونه روی هردو سیستم عامل طراحی شده است یک دیت پیکر (date picker) است. کاربران اندروید با اسلات ماشین حالت حلقه ای انتخاب کننده تاریخ که در iOS رایج است آشنا نیستند. استفاده از این استایل دیت پیکر در اندروید خواهان نمایشهای سفارشی است، که میتواند پیچیده باشد، با افزایش پیچیدگی و دوره توسعه و بیگانه سازی طراحی اپ شما به سیستم عامل اندروید.Left — standard iOS controls; right — standard Android controls Left — standard iOS pickers; right — standard Android pickers حالت‌های دکمه‌ای در iOS و Androidدو حالت دکمه در راهنمایی‌های متریال دیزاین وجود دارد:· صاف· برافراشتهاین دکمه‌ها در موقعیت‌های مختلفی استفاده می‌شوند. حروف روی دکمه‌ها در متریال دیزاین معمولا همگی حروف بزرگ هستند. گاهی اوقات ما دکمه حروف بزرگ را در اپ‌های نیتیو هم می‌بینیم، اما اکثرا به حالت عنوان دار می‌یابیم.Left — standard Material Design buttons; right — standard HIG buttons همچنین نوعی دیگر از دکمه وجود دارد دکمه‌های Floating Action در اندروید و فراخوان به عمل در iOS. یک دکمه عملکرد متغیر فعالیت اولیه در یک اپلیکیشن را به نمایش می‌گذارد. برای مثال دکمه تنظیم کننده در یک اپ پیامرسان یا دکمه پست جدید در یک رسانه اینترنتی می‌تواند دکمه فعالیت متغیر باشد.طراحی انالوگ برای فعالیت اولیه در اپ‌های iOS دکمه فراخوان به فعالیت است که در مرکز نوار ابزار قرار گرفته است.Left — standard floating action button in iOS; right — standard CTA button in Android تفاوت‌های موجود در صفحات پایینی نیتیو در Android و صفحات عملکرد و نمایش های فعالیت در iOSدو نوع صفحات تحتانی در Android وجود دارد :صفحات تحتانی مقید (Modal Bottom Sheets) و صفحات تحتانی پایا (Persistent Bottom Sheets).صفحات تحتانی مقید دو نوع محتوی دارند: صفحات تحتانی مقید با عملکرد متفاوت و یک اپ لیست که بعد از ضربه کاربر روی آیکون اشتراک نمایان میشود. ما می‌توانیم محتوای یکسانی در صفحات عملکرد نیتیو iOS و نمایش‌های فعالیت‌ها پیدا کنیم. ولی این اجزا با صفحات تحتانی اندروید متفاوت اند.Left — standard Material Design bottom sheets; right — action sheet in iOS app ‌تفاوت‌ها در اهداف لمسی و شبکه‌هاiOS و Android راهنمایی‌های تقریبا متفاوتی برای اهداف لمسی دارند.(44px @1x for iOS and 48dp/48px @1x for Android).راهنمایی‌های متریال دیزاین همچنین ردیف کردن همه عوامل برای یک مربع 8dp شبکه مبنا را توصیه میکند.تفاوت‌های نشانه‌ایسن فرانسیسکو سیستم طرح حروف در iOS است. روبوتو طرح حروف استاندارد در اندروید است. نوتو طرح حروف استاندارد برای تمام زبان‌ها در کروم و اندروید است که توسط روبوتو پشتیبانی نمی‌شوند. شما بایدبه انجمن‌های طرح بندی و چاپی هر سیستم عامل توجه کنید.Left — Material Design typography; right — HIG typography ریز دستورهاوقتی زمان طراحی فرا میرسد، اولین حدس و گمان برای کاربران آخرین حدس و گمان است.برای همین این عمل برای جلب توجه کاربران از ابتدای امر بسیار حائز اهمیت است. در طی طراحی اپ و توسعه، ما می‌توانیم تجربه جذابی برای کاربران در طی ریزدستورها و تحرک‌ها بسازیم.حال میخواهیم قوانین بزرگتر(مهمتر) و توصیه‌هایی در ارتباط یا فعل و انفعالات و حرکت‌ها برای هردو سیستم عامل را توضیح دهیم و به نمونه‌های همراه با جزئیاتی نگاهی بیندازیم.توجه و اهمیت فعل و انفعالات تمرکز روی توجه کاربران در آنچه که حقیقتا در اپ‌ها اهمیت دارد، بنابراین استفاده از آن‌ها فقط زمانی که واقعا خواسته شده‌اند لازم است. هردو سیستم عامل تحرک بیش از اندازه را سست می‌کند همانطور که کاربران را گیج و خسته می‌کنند.ثبات و سلسه مراتب بسیار حائز اهمیت است که بدانیم فعل و انفعالات به کاربران کمک می‌کند تا خود را دریک جهت با نشان دادن اینکه چگونه عوامل دیگر بهم مرتبط‌اند، در اپ هدایت کنند. راحت و محبوب است جابجایی از یک صفحه به صفحه دیگر و کاربران را مجذوب می‌کند. تحرک‌ها حاکی از چگونگی اجرای عملکردها است و توصیه‌های کمک کننده‌ای را پیشنهاد میدهد.اگرچه توصیه اصلی برای استفاده از میکرو انیمیشن‌ها تقریبا در راهنماهای متریال دیزاین و HIG مشابه است، اما تفاوت‌هایی وجود دارد که بطور واضح توضیح داده شده است. کاربران به این سیستم عامل‌های خاص عادت دارند و آن‌ها را طبیعی می‌دانند.به همین دلیل توجه خاص به فعل و انفعالات آشنایی که تجربه کاربر را بهبود می‌بخشند و در هر سیستم عامل طبیعی جلوه می‌کنند بسیار مهم است.iOSکاربران iOS به انیمیشن‌های دقیق که در iOS استفاده شده، مانند جابجایی راحت عادت کرده‌اند، تغییرات روان در جهت‌یابی و ثبت فیزیکی‌. کاربران iOS می‌توانتد به هنگام حرکت‌هایی که منطقی نیستند یا قوانین فیزیک را به چالش بر می‌انگیزند احساس بی نظمی داشته باشند. اگر یک کاربر با پایین کشیدن صفحه یک نمایش از بالا را آشکار کند، برای مثال آن‌ها توقع دارند که بتوانند با به عقب کشیدن آن نمایش را تمام کنند. HIG به شدت ساختن یک تجربه عمیق مثل یک بازی را توصیه می‌کند مگر اینکه شما جابجایی‌های سفارشی را برای ساخت در انیمیشن‌ها قابل مقایسه کنید.Androidباتوجه به راهنماهای متریال دیزاین، در طی یک جابجایی، عوامل مشترک که تبدیل شده‌اند بصورت خروجی، ورودی یا ثابت طبقه بندی شده‌اند. دسته بندی مورد نظر که آیتم‌ها به آن وابسته‌اند در چگونگی تبدیل شدن آن موثرند.یک انیمیشن توجه کاربران را هدایت میکند. وقتی یک UI ظاهر را تغییر میدهد، حرکت آن پیوستگی بین موقعیت مکانی و ظاهر عوامل را قبل و بعد از جابجایی تامین میکند.جابجای‌های راهبری عامل مهمی در فعل و انفعال سراسری با یک تقابل می‌باشند. آن‌ها به کاربران کمک می‌کنند تا توسط شرح سلسله مراتب خود را عادت دهند. برای مثال وقتی یک عامل برای پر کردن صفحه کامل توسعه می یابد، عمل توسعه توضیح میدهد که صفحه جدید یک عامل کوچک است. صفحه‌ای که از آن توسعه یافته است عامل والد است.Example of a parent-to-child transition (Material Design Guidelines) از یک صفحه منشا یک عامل کوچک جاسازی شده به هنگام لمس بالا کشیده میشود و در مکان توسعه می یابد.جابجایی روی صفحه کوچک تمرکز میکند درحالی که ارتباط بین بزرگ و کوچک را تقویت میکند‌.صفحاتی که منشا یکسانی را به اشتراک میگذارند (مانند تصاویر یک آلبوم، قسمت‌های یک پروفایل، یا گام‌هایی در یک جریان) در اتحاد به تقویت رابطه آن‌ها پیش میرود. صفحه اسلایدهای جفت در یک طرف درحالی که متعلقات آن در جهت مخالف از صفحه خارج میشوند‌‌.Tabs are at the same elevation and move together on the horizontal در بالاترین لول یک اپ اهداف معمولا در کارهای عمده جمع آوری می‌شوند (که ممکن است بهم مرتبط نباشند) جابجایی صفحات در مکان توسط تغییر ارزش‌ها مانند کدر بودن و تراز آن انجام میشود.نتیجهقطعا توقعاتی وجود دارد: بعضی از اپلیکیشن‌های iOS راهنماهای متریال دیزاین را دنبال می‌کنند (مانند جیمیل) و بعضی از اپ‌های Android راهنماهای HIG (مانند اینستاگرام)Left — Gmail on iOS; right — Gmail on Android Left — Instagram on iOS; right — Instagram on Android اما یک موضوع مشخص است. با استفاده از اجزای نیتیو برای هردو سیستم عامل برای طراحی یک اپلیکیشن موبایل سریعتر است. بنابراین، بهتر است که زمان را روی طراحی صرف کنید تا اینکه یک ماکت اپلیکیشن بسازید که تلفیقی از راهنماهای HIG Apple و اجزای دیزاین متریال گوگل است، و سپس زمان زیادی در توسعه بابت عوامل سفارشی صرف کنید‌.زحمت ترجمه این مقاله رو خانم فاطمه عباسی کشیدن و من فقط ویراستاری کردمامیدوارم که از این مقاله لذت برده باشید</description>
                <category>Mahan PoorYazdanKhah</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Thu, 03 Oct 2019 23:18:59 +0330</pubDate>
            </item>
                    <item>
                <title>اندازه قلم و دستورالعمل‌های طراحی متریال دیزاین</title>
                <link>https://virgool.io/DesignersCommunity/%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%D9%87-%D9%82%D9%84%D9%85-%D9%88-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%87%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D8%AA%D8%B1%DB%8C%D8%A7%D9%84-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-b29d3r73x9el</link>
                <description>در این مقاله می‌خواهیم به اندازه قلم‌ها و دستورالعمل‌های مربوط به آن در طراحی های UI بپردازیم و راهنمای کاملی برای طراحی‌های متریال دیزاین (Material Design) به شما ارائه دهیم. تمامی اندازه‌ها توسط گوگل ارائه شده است. در ادامه با ما همراه باشید.اگر شما برنامه‌ای به سبک متریال دیزاین طراحی کردید و می‌خواهید بدانید که چه اندازه قلمی برای برنامه مناسب است می توانم این مژده را به شما بدهم که جای درستی آمده‌اید.همانطور که میدانید مقیاس اندازه قلم در اندروید sp می‌باشد که مناسب‌ترین مقیاس برای اندازه قلم است و همچنین برای پیکسل قابل اندازه گیری است و نسبت به تعداد آن متغییر است. البته به عنوان یک طراح باید بدانید که مقیاس‌های دیگری هم وجود دارند؛ مانند dp ,pt و px که می‌توان از آن‌ها هم استفاده کرد.دستورالعمل تایپوگرافی گوگل برای استاندارد متریال دیزاینشما می‌توانید در جدول زیر خلاصه‌ای از اندازه قلم مناسب برای هرقسمت رو مشاهده کنید:هرکسی که اندازه قلم متریال دیزاین رو مطرح کرده فرد باهوشی بوده.در ادامه به بررسی تک تک عنوان‌ها می‌پردازیم:عنوان صفحهدر طراحی متریال دیزاین اندازه عنوان‌ها 20sp می‌باشد و همچنین از فونت سایز متوسط استفاده می شود.متناندازه متن در طراحی متریال دیزاین 20sp می‌باشد. این اندازه فونت عادی است و نیازی به تغییر نیست.زمانی که قرار است متن کمی در داخل یک مدل کوچک نمایش داده شود اندازه متن را 16sp در نظر بگیرید.لیست عنوان هابسیاری از لیست‌های ساده هر عنوان را با 16sp نشان می‌دهد.در واقع این به عنوان اندازه پیش فرض در طراحی متریال دیزاین است.از آنجایی که اهمیت عنوان از متن بیشتر است عنوان آیتم‌ها از خود آیتم‌ها باید بزرگتر باشد و برای نشان دادن این اهمیت از فونت سایز متوسط استفاده می‌کنیمبرای مثال اگر از فونت Sans-Sarif برای متن‌های خود استفاده می‌کنید برای عنوان از فونت Sans-Sarif-Medium استفاده کنید.همچنین با این کار شما می‌توانید کنتراست روشن بین عنوان آیتم و متن داشته باشیدعنوان‌ آیتم‌های همبرگر منو را با 14sp و فونت سایز متوسط نمایش می‌دهند.کنترل‌های فرمفکر می‌کنم در عکس زیر همه چیز واضح استسوالی که شاید برای شما هم بوجود آمده باشد این است که چرا سایز متن ورودی 16sp است؟از آنجایی اهمیت کلمه های ورودی از متن و کلمه های داخل برنامه بیشتر است باید پس متن های ورودی سایز بزرگتری نسبت به سایر متن‌ها دارد.منبع:https://bit.ly/3jRf00Xپیشنهاد می کنم مقاله Navigation Drawer یا منوی کشویی چیست را مطالعه کنید.</description>
                <category>Mahan PoorYazdanKhah</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Thu, 05 Sep 2019 00:42:15 +0430</pubDate>
            </item>
                    <item>
                <title>Navigation Drawer یا منوی کشویی چیست؟</title>
                <link>https://virgool.io/@mahanpyk/navigation-drawer-%DB%8C%D8%A7-%D9%85%D9%86%D9%88%DB%8C-%DA%A9%D8%B4%D9%88%DB%8C%DB%8C-%DA%86%DB%8C%D8%B3%D8%AA-rzeidu8b9oy4</link>
                <description>Navigation Drawer , Sliding Menu یا منوی کشویی به لایه‌هایی گفته می‌شود که منوی اصلی اپلیکیشن را نمایش می‌دهد. این منو در حالت عادی از دید کاربر مخفی است که با کشیدن صفحه به سمت راست یا در برنامه‌هایی که به زبان فارسی هستند به سمت چپ و یا لمس آیکن موجود در تولبار یا اکشن بار، ظاهر می‌شود. منو کشویی از یک Header و Menu تشکیل می‌شود. Navigation Drawer توسط اندروید معرفی شده و به راحتی قابل پیاده سازی می‌باشد.آموزش ساخت منو کشویی کاستوم در سمت راست اندرویددر اندروید منوکشویی همیشه در سمت چپ وجود داره و راست چین یا rtl کردن این لایه کمی سخت است. از طرفی بخاطر نوع ساختار مادر Navigation Drawer این لایه دارای محدودیت‌های ظاهری می‌باشد و خیلی قابل تغییر نمی‌باشد. برای تمام این مشکلات یک راه خیلی ساده هستش. شما باید منو کشویی را به صورت دستی بسازید تا در سمت راست و هرشکلی که شما دوست دارید باشد.مرحله اول:ابتدا یک لایه جدید برای طراحی منو کشویی یا همبرگرمنو می‌سازیم.مرحله دوم:فرقی نمی کنه که لایه روت چی باشه در اینجا من از LinearLayout استفاده کردم؛ شما می‌تونید از هرچیز دیگه‌ای استفاده کنید، اما توجه داشته باشید که باید مقدار width لایه ایجاد شده را برابر با 300dp یا هر مقداری به غیر از match parent قرار میدهیم. (توجه کنید که این مقدار در واقع سایز Navigation Drawer یا همان منوی کشویی ما هستش که بر روی صفحه‌های دیگر می‌آید)مرحله سوم:خاصیت gravity این لایه را می‌توانید با توجه به اینکه در کدام سمت صفحه بخواهید باشد برابر با end یا start قرار دهید البته توجه داشته باشید که در برنامه‌های دو زبانه جای آن تغییر می‌کند. (اگر می‌خواهید لایه در هردو زبان در یک جهت قرار بگیرد بهتر است که از مقادیر right یا left استفاده کنید)مرحله چهارم:حالا می‌توانید ویوهای لازم و مورد نیاز خود را در این صفحه طراحی و جای گذاری کنید.در اینجا من اول در داخل ConstrainLayout یک RelativeLayout گذاشتم که در مرکز اون لایه TextView هستش و بعد از اون از لایه‌های LinearLayout استفاده کردم برای آیتم‌های منوکشویی.مرحله پنجم:در این مرحله بعد از اتمام طراحی به صفحه‌ی اصلی برنامه که در اینجا activity_main می‌باشد برمی‌گردیم و لایه مادر یا اصلی صفحه را به DrawerLayout تغییر می‌دیم تا بتواند صفحه‌ای که به عنوان منو کشویی کاستوم طراحی کردیم را در خود نمایش دهد.مرحله ششم:حالا صفحه‌ی طراحی شده را از طریق دستور include در صفحه‌ی اصلی فراخوانی می‌کنیم.&lt;include layout=&amp;quot@layout/nav_drawer&amp;quot /&gt;مرحله هفتم:الان شما به تمام ویو‌های صفحه طراحی شده در صفحه اصلی و کلاس جاوا دسترسی دارید و می‌توانید برای آن‌ها رویداد تعریف کنید. (توجه داشته باشید که برای دسترسی به ویو‌ها باید برای آن‌ها آیدی تعریف کرده باشید)در ادامه ما قصد داریم دکمه یا ویویی را تعریف کنیم که می‌خوایم با زدن بر روی اون منوی کشویی ما نمایش داده بشه. روش اصولی این هست که ما بیایم این دکمه در قسمت اکشن بار یا تولبار تعریف کنیم تا با زدن روی اون دکمه همبرگر منوی ما ظاهر بشه.مرحله هشتم:حالا در کلاس جاوا برای عمل دکمه‌ای که تعریف کردیم آن کلیک تعریف می‌کنیم و دستورات زیر رو می‌نویسیم.ImageView menu = findViewById(R.id.img_menu);
menu.setListener(new View.Listener() {
public void (View v) {
DrawerLayout drawerLayout = findViewById(R.id.drawerlayout);
if (drawerLayout.isDrawerOpen(Gravity.RIGHT))
drawerLayout.closeDrawer(Gravity.LEFT);
else
drawerLayout.openDrawer(Gravity.RIGHT);
}
});توجه داشته باشید که این منو کشویی کاستوم را می‌توانید در همه‌ی صفحات خود داشته باشید و برای اینکار باید مرحله‌ی هفتم و هشتم را مجدداً در اکتیویتی‌های دیگر انجام دهید. با این روش خیلی ساده می‌تونید یک منو کشویی در سمت راست داده باشید.در ادامه نحوه عملکرد آیتم‌های همبرگر منو را برای شما توضیح میدم که به چه صورت هستش.همانطور که گفته شد شما بعد از include کردن ویو در صفحه اصلی به تمام آیتم‌ها دسترسی دارید و با فراخوانی آیدی آیتم‌ها می‌توانید برای آن‌ها عملکردهای متفاوتی تعریف کنید. به عنوان مثال در عکس زیر من میخوام برای آیتم اول منوی کشویی تعریف کنم، زمانی که روش کلیک شد به اکتیویتی دیگه بره (در اینجا برای مثال به Main2Activity میره)LinearLayout item1 = findViewById(R.id.nav_item1);
item1.setListener(new View.Listener() {
@Override
public void (View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});شما می‌تونید به همین صورت برای بقیه آیتم‌های منو خودتون این عمل رو تکرار کنید.پیشنهاد میکنم مقاله اندازه قلم در طراحی را نیز بخوانید. نکات جالب و مهمی در مورد اندازه قلم خواهید آموخت.</description>
                <category>Mahan PoorYazdanKhah</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Wed, 04 Sep 2019 22:35:33 +0430</pubDate>
            </item>
                    <item>
                <title>Intent در اندروید</title>
                <link>https://virgool.io/@mahanpyk/intent-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-yhtj4exd6yln</link>
                <description>همانطور که می دانید از دستور Intent برای جابه جایی بین اکتیویتی ها (Activitys) و همچنین انجام کارهایی مثل ارسال اس ام اس، بازکردن مرورگر و... استفاده می‌شود.Intent ها به سه دسته تقسیم می‌شوند که عبارتند از:1. واضح یا Explicit intent2. مطلق یا Implicit intent3. فیلتر ها یا Intent-filterExplicit Intent همانطور که از اسمش معلومه &#x27;آشکار&#x27; یا &#x27;مشخص&#x27; هستش. منظور از آشکار و مشخص بودن Intent این است که در این نوع، اکتیویتی ها مشخص هستند و در واقع از اکتیوتی هایی که داخل برنامه تان هست استفاده می‌کنید مانند مثال زیر که میخواهیم از اکتیوتی 1 به اکتیویتی 2 برویم:Intent intent = new Intent(Activity1.this, Activity2.class);
startActivity(intent);احتمالاً حدس میزنید که Implicit intent دقیقا برخلاف Intent قبلی باشد و شما می توانید به هر اکتیویتی بروید و از هر سرویسی استفاده کنید. زمانی که شما از این نوع Intent استفاده میکنید IDE لیست بلند بالایی از سرویس هایش را برای شما نشان می دهد که هرکدام برای کاری هستند. درواقع وقتی قصد دارید اندروید برای شما کاری را انجام دهد و برایتان مهم نیست که چه اکتیویتی یا چه سرویسی آن کار را انجام می دهد، باید از این نوع Intent ها استفاده کنید به مثال زیر توجه کنید:اشتراک گذاری لینک با Intent در اندرویدIntent intent = new Intent(Intent.ACTION_SEND);
intent.setType(&amp;quottext/plain&amp;quot);
intent.putExtra(Intent.EXTRA_TEXT,&amp;quotآدرس اینترنتی&amp;quot);
startActivity(Intent.createChooser(intent, &amp;quotاشتراک گذاری به وسیله ...&amp;quot));در مثال بالا از Intent خواسته شده که آدرس اینترنتی را بازکند. اهمیتی ندارد که کاربر با چه مرورگری یا خارج از برنامه آن را باز می‌کند، مهم این است که کاربر به آن آدرس اینترنتی دسترسی داشته باشد. البته می‌توان اینکه با چه مرورگری بازشود و دیگر عناصر را کنترل کرد.ارسال ایمیل با Intent در اندرویدIntent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(&amp;quotmailto&amp;quot,&amp;quotexample@gmail.com&amp;quot, null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, &amp;quotعنوان&amp;quot);
emailIntent.putExtra(Intent.EXTRA_TEXT, &amp;quotمتن ایمیل&amp;quot);
startActivity(Intent.createChooser(emailIntent, &amp;quotSend email...&amp;quot));ارسال smsبا Intent در اندرویدUri uri = Uri.parse(&amp;quotsmsto:12346556&amp;quot);
Intent SMSintent= new Intent(Intent.ACTION_SENDTO, uri);
SMSintent.putExtra(&amp;quotsms_body&amp;quot, &amp;quotمتن اس ام اس &amp;quot);
startActivity(SMSintent);Intent-filter اینگونه عمل می کنند که وقتی از طریق Intent در خواستی برای اندروید فرستاده شد، اندروید همه ی نرم افزار هایی که برای انجام آن در خواست مناسب هستند را تشخیص و برای کاربر لیست می کند، تا کاربر نرم افزار دلخواه خود را برای انجام آن درخواست انتخاب کند. در واقع اندروید به وسیله ی Intent-filter ها تشخیص می دهد که چه نرم افزار هایی امکان اجرای آن درخواست را دارد.یک Intent-filter مشخص می کند که نرم افزار شما قادر است چه نوع در خواست هایی را اجرا کند. در واقع Intent-filter، قابلیت های نرم افزار شما را تعریف می کند. اگر برای یک اکتیوتی یا سرویس Intent-filter تعریف نشود، آن اکتیویتی فقط به صورت واضح یا (Explicit Intent) قابلیت فراخوانی دارد.برای تعریف Intent-filter ها دو راه وجود دارد:1. تعریف آن ها در AndroidManifest2. استفاده از BroadCastReceiverدر روش اول وقتی نرم افزار نصب می شود، اندروید تمام Intent-filter هایی که تعریف کرده اید را ثبت می کند. با این کار اگر کاربر درخواستی را ارسال کند که در Intent-filter شما تعریف شده باشد که برنامه شما توانایی انجام درخواست را دارد، برنامه شما به کاربر پیشنهاد داده می شود. نیازی نیست که نرم افزار شما درحال اجرا یا قبلا اجرا شده باشد؛ چرا که قبلا در اندروید ثبت شده که برنامه شما این توانایی را دارد.به مثال زیر توجه کنید:&lt;activity
android:name=”.ActivityExample”
android:label=”Example”&gt;
&lt;intent-filter&gt;
&lt;action android:name=”android.intent.action.VIEW” /&gt;
&lt;category android:name=”android.intent.category.DEFAULT”/&gt;
&lt;data android:schema=”https”/&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;در مثال بالا نرم افزار به عنوان مرورگر وب در اندروید ثبت می شود؛ حالا تمام ادرس های اینترنتی که با https شروع شود برنامه شما هم به عنوان نرم افزار پیشنهادی به کاربر نمایش داده میشود.BroadCastReceiver رو اگه بخوایم ساده بیان کنیم به معنی فالگوش وایسادن میشه. وقتی درخواستی توسط کاربر ارسال میشه اندروید با استفاده از BroadCast درخواست رو اعلام میکنه و هر نرم افزاری که Reciver برای اون BroadCast تعریف کرده باشه، به کاربر پیشنهاد داده میشه.در مورد این مبحث در یه مقاله جداگونه کامل حرف می زنیم. استفاده اصلی این قسمت در فروشگاه های اینترنتی است که شما با استفاده از یک لینک که بین سایت و اپلیکیشن مشترک است اپلیکیشن خود را باز کرده و محصول مورد نظر را نمایش می دهید.ارسال و دریافت اطلاعاتهمانطور که گفته شد از Intent برای جابه جایی بین اکتیویتی ها و انجام کارها استفاده می شود و گاهاً نیاز است که همراه با آن اطلاعاتی ارسال شود. در واقع یک Intent دارای یک فرآیند از اطلاعات پایه ای می باشد که آن اطلاعات عبارتند از کاری که می خواهیم انجام بدیم؛ از جمله اکشن (Action) و نوع (Type) که برای هر نوع در خواست می تواند متفاوت باشد و حتی اطلاعات بیشتر یا کمتری مورد نیاز باشد. برای این دسته از اطلاعات که ضروری هستند و باید همراه با Intent ارسال شود از متد های ()getAction و ()getType استفاده می کنیم.Putextra در اندروید چیست؟همانطور که مشاهده می کنید متد putextra در Intent های بالا استفاده شده. حال می خواهیم توضیحات بیشتری در مورد putextra به شما بدهیم. ممکن است بخواهید غیر از اطلاعات ضروری، داده های دیگری را همراه با Intent ارسال کنید. برای اینکه داده ای یا آبجکتی را همراه با Intent ارسال کنیم از متد putextra استفاده می کنیم. فرض کنید در اکتیوتی اول یک عنوان دارید که وقتی کاربر یکی از آن ها را انتخاب کرد، در اکتیوتی دوم قرار است که اطلاعات بیشتری در مورد آن عنوان کسب کند. برای اینکه عنوان را از اکتیوتی اول به اکتیوتی دوم پاس دهیم به روش زیر عمل می کنیم:Intent intent = new Intent(Activity1.this, Activity2.class);
intent.putExtra(“KEY”, Value);
startActivity(intent);همانطور که مشاهده می کنید داده اضافی توسط متد putextra به Intent اضافه شده و همراه با آن ارسال میشود.putextra دو پارامتر دارد:KeyValueپارامتر اول در واقع کلید داده ای است که فرستادیم و پارامتر دوم خود داده.کلید از نوع String است و داده ما از انواع متغییر های اصلی (int, String و...) می باشد.حال که از اکتیوتی 1 مقداری را ارسال کردیم، باید از اکتیوتی 2 آن را دریافت کنیم.روش دریافت به صورت زیر است:Bundle extras = getIntent().getExtras();
if (extras != null) {
String value = extras.getString(&amp;quotKey&amp;quot);
}خط اخر که متغییری از نوع String است به مقدار ارسالی از اکتیویتی 1 بستگی دارد و به این صورت است که اگر از اکتیوتی 1 چه نوع داده ای ارسال شده.برای مثال اگر در اکتیویتی اول یک مقدار عددی که int می باشد ارسال شود در اکتیوتی دوم باید متغییر تعریفی از نوع int و Bundle با متد ()getint دریافت شود.در مثال های بالا طریقه ارسال یک متغییر از اکتیوتی به اکتیوتی دیگری را برای شما توضیح دادیم. اما اگر قرار باشد که آبجکتی ارسال شود چه؟!معمولا زمانی که می‌خواهیم یک برنامه رو توسعه بدیم، نیازداریم که داده‎هایی رو از یک اکتیویتی به اکتیویتی دیگری بفرستیم و ما نمی‌تونیم اینکار را به صورت مستقیم انجام بدیم. در بعضی از موارد اطلاعاتی که ما نیاز به انتقال آن ها داریم، باید به یک آبجکت تبدیل بشه تا انتقالشون بدیم.اینبار قصد داریم از اکتیویتی 1 آبجکتی را به اکتیویتی 2 ارسال کنیم. مانند روش قبل با استفاده از متد putextra آبجکت را در Intent قرار میدهیم و به اکتیوتی 2 ارسال میکنیم:Intent intent = new Intent(Activity1.this, Activity2.class);
Example obj_example  = new Example();
intent.putExtra(&amp;quotobject&amp;quot, obj_example );
startActivity(intent);به نظر میرسد همه چیز درست است اما کامپایلر از این خط کد خطا می گیرد و میگوید که نمی توانید این مقدار را ارسال کنید!برای حل این مشکل باید به کلاس آن آبجکت رفته و اینترفیس Serializable را در این کلاس implements کنیم. با این کار خاصیت سریالایز شدن برای کلاس فراهم می شود و می تواند از طریق Intent ارسال شود.class Example implements Serializable {
//TODO
}در زمان دریافت آبجکت در اکتیوتی 2 نیز به روش قبل عمل می کنیم:Bundle bundle = getIntent().getExtras();
if (bundle != null) {
Example example = bundle.getObject(&amp;quotobject&amp;quot);
}این بار نیز کامپایلر از شما خطا میگیردبرای گرفتن آبجکت کافی است به روش زیر عمل کنیم:Example example = getIntent().getSerializableExtra(&amp;quotobject&amp;quot);در مثال بالا دیدیم که اینترفیس Serializable در کلاس آبجکت implements شد. اگر بخواهیم یک آبجکت جاوا (برای مثال  Person، Car، Employee، و...) را انتقال بدیم، باید یکسری اقدامات اضافی انجام بدیم تا بتونیم اطلاعات رو منتقل کنیم. برای انجام این کار، شئ ما باید یا به Serializable یا به Parcelable تبدیل بشه.Serializable چیست؟Serializable یک رابط استاندارد جاوا است. اما بخشی از Android SDK نیست. بسیار ساده و آسونه. فقط با اجرای این رابط کاربری یک شئ جاوا آمادست تا از یک Activity به Activity دیگری منتقل بشه. در تکه کد زیر می‌توانید ببینید که این رابط کاربری چقدر ساده است.import java.io.Serializable;
public class Person implements Serializable {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age){
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}از آنجا که Serializable یک رابط نشانگر است، ما مجبور نیستیم کلی متد های دیگر را امپلیمنت کنیم.  هنگامی که ما &quot;POJO&quot; خود را با آن علامتگذاری میکنیم، جاوا سعی خواهد کرد که آن را سریالایز کند.البته این روش ساده عیب هم دارد. استفاده از آن موجب می‌شود در طول مسیر تعداد زیادی اشیاء اضافی ایجاد شود. این اتفاق باعث تولید زباله‌های زیادی برای زباله جمع کن (garbage collection) می‌شود. در نتیجه عملکرد را ضعیف کرده و تخلیه باتری سریعتر است.Parcelable چیست؟Parcelable یک رابط دیگر است. این رابط بخشی از Android SDK است. در حال حاضر، Parcelable به طور خاصی طراحی شده است که هیچ شئ اضافی در هنگام استفاده از آن وجود دارد. در قطعه کد زیر می‌توانید یک نمونه استفاده از رابط Parcelable را مشاهده کنید:import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age){
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.firstName);
dest.writeString(this.lastName);
dest.writeInt(this.age);
}
protected Person(Parcel in) {
this.firstName = in.readString();
this.lastName = in.readString();
this.age = in.readInt();
}
public static final Parcelable.Creator&lt;Person&gt; CREATOR = new Parcelable.Creator&lt;Person&gt;() {
@Override
public Person createFromParcel(Parcel source) {
return new Person(source);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}البته، استفاده از Parcelable نیز معایبی را دارد! از آنجا که کدهای boilerplate، POJO را از بالا نگه می دارد، درک آن بسیار سخت است.Parselable VS Serializable در اندرویداگر برای دستیبانی به سوال کدوم بهتره در وب جستجو کنید متوجه می شید که هیچ کدوم برنده واقعی نیستند و نتایج بسیار به هم نزدیک هستند. مردم و مقالات حارجی زیادی هستند که از یکی از این دو حمایت می کنند. بنابراین، من هر دو طرف را به شما ارائه می دهم و شما را برای خود تصمیم بگیرید!اولین تیم در پشت این ایده است که Parcelable سریعتر و بهتر از Serializable است. البته، این اطلاعات در پشت این بیانیه وجود دارد.نتایج آزمایشات فیلیپ برول (Philippe Breault) نشان می دهد که Parcelable بیش از 10 برابر سریعتر از Serializable است. بعضی از مهندسان گوگل نیز این بیانیه را پشت سر می گذارند.در حال حاضر تیم دوم ادعا می کند که همه ما آن را اشتباه انجام می دهیم! و استدلال آنها به اندازه کافی منطقی است!به گفته آنها، روال پیش فرض Serializable کندتر از Parcelable است و در اینجا ما توافق بین دو طرف را داریم! بله، این غیرعادی است که همه اینها را مقایسه کنید! از آنجا که با Parcelable ما در واقع در حال نوشتن کد سفارشی هستیم. کد به طور خاص برای آن POJO ایجاد شده است. بنابراین هیچ زباله ای ایجاد نمی شود و نتایج بهتر است. اما با روشی پیش فرض Serializable، ما به فرایند سریال سازی خودکار جاوا تکیه می کنیم. ظاهرا این فرآیند سفارشی نیست و مقدار زیادی زباله ایجاد می کند! بنابراین، نتایج بدتر.اکنون روشی دیگر وجود دارد. تمام فرایند اتوماتیک پشت Serializable را می توان با کد سفارشی جایگزین کرد که از روش ()writeObject و ()readObject استفاده می کند. این روش ها خاص هستند. اگر ما می خواهیم رویکرد سریالی را در ترکیب با رفتار سریال سازی سفارشی تکیه کنیم، باید این دو روش را با همان امضای دقیق به عنوان یکی از زیر وارد کنیم:private void writeObject(java.io.ObjectOutputStream out)
throws IOException;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;اما این چگونه کار می کند! در حال حاضر، در این دو روش می توانیم منطق دلخواهمان را پیاده کنیم. اگر انجام شود به درستی، زباله مرتبط با روش پیش فرض Serializable دیگر عامل نخواهد بود!و در حال حاضر مقایسه بین Parcelable و Serializable سفارشی به نظر من عادلانه است! نتایج ممکن است شگفت انگیز باشد! روشی سفارشی Serializable بیش از 3 برابر سریعتر برای نوشتن و 1.6 برابر سریعتر برای خواندن از Parcelable است.به نظر من، تفاوت در سرعت بین دو رویکرد در اکثر موارد تقریبا ناچیز است. بنابراین، در پایان روز، مهمتر از آن است که کار را انجام دهیم و کاربران شاد داشته باشیم، تا برنامه ای با 0.000042 میلی ثانیه سریعتر اجرا شود.در قسمت سورس سایت پروژه اندروید خوبی در مورد افزایش لایک و فالوور اینستاگرام منتشر کردیم. با استفاده از این لینک می تونید این پروژه رایگان را ببینید.یکی از مشکلات مهمی که همه برنامه نویس های اندرویدی دارند اجرای برنامه روی گوشی خودشون هستش!!! پیشنهاد می کنم مقاله اجرای اپلیکیشن با WIFI در اندروید را بخونید تا از دست کابل بازی راحت بشید.</description>
                <category>Mahan PoorYazdanKhah</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Wed, 04 Sep 2019 21:48:03 +0430</pubDate>
            </item>
                    <item>
                <title>افزونه ADB Wi-Fi</title>
                <link>https://virgool.io/MobileLab/%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-android-wifi-adb-busejprxuaqh</link>
                <description>افزونه ADB Wi-Fiاین افزونه یا پلاگین قابلیت نصب برروی IDE های IntelliJ و Android Studio  را دارد و برای اتصال سریع گوشی‌های Android از طریق وای فای ایجاد شده است. شما می‌توانید به راحتی برنامه خود را اجرا و اشکال زدایی کنید بدون اینکه نیازی به اتصال USB داشته باشید. تنها با فشار دادن یک دکمه به تلفن خود متصل شوید و دیگر کابل USB را فراموش کنید.افزونه ADB Wi-Fi یک دکمه ADB Wi-Fi را به IntelliJ / Android Studio Toolbar اضافه می‌کند تا از طریق آن بتوانید دستگاه خود را به کامپیوتر متصل کنید.برای استفاده از این افزونه، پروژه‌ای که در IntelliJ / Android Studio شما باز شده است، باید یک پروژه اندروید با Android SDK باشد.آموزش راه اندازی ADB Wi-Fiبرای اضافه کردن این قابلیت از منوی فایل گزینه ی Settings را انتخاب کنید یا کلیدهای Ctrl + Alt + S را فشار دهید تا صفحه تنظیمات اندروید استودیو باز شود.گزینه Plugins را انتخاب کنید تا گزینه های مربوط به آن را مشاهده کنید سپس کلمه ADB Wi-Fi را جستجو کنید تا پلاگین مربوطه برای شما نمایش داده شود و سپس پلاگین رو نصب کنید. بعد از اتمام نصب اندروید استودیو رو مجددا راه‌اندازی کنید تا پلاگین فعال شود.حالا یک دکمه جدید به اندروید استودیو اضافه شدهروش کار ADB Wi-Fiدر ابتدا باید توجه داشته باشید که گوشی و کامپیوتر باید به یک شبکه اینترنت متصل باشند (یعنی یا هردو به یک وای فای متصل باشند یا می تواند از طریق Hotspot به خود گوشی متصل باشد) سپس برای استفاده از این قابلیت ابتدا باید یکبار گوشی خود را با کابل به کامپیوتر متصل کنید و در قسمت ADB Wi-Fi به گوشی خود متصل شویدبعد از زدن دکمه Connect گوشی شما به اندروید استودیو متصل شده و بعد از آن می‌توانید به صورت بی سیم روی گوشی برنامه های خود را اجرا و تست کنید.همچنین شما می توانید با زدن دکمه Disconnect اتصال اندروید استودیو را با گوشی قطع کنید.طبق نظر سنجی ها مشخص شده خیلی از برنامه نویس های اندروید هنوز در مورد Intent اطلاعات کافی و کامل ندارند. مقاله آموزش کامل Intent در اندروید را مطالعه کنید.</description>
                <category>Mahan PoorYazdanKhah</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Wed, 04 Sep 2019 21:20:21 +0430</pubDate>
            </item>
            </channel>
</rss>