<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>material-design &#8211; Mahdi Tajik</title>
	<atom:link href="http://www.mahditajik.ir/tag/material-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mahditajik.ir</link>
	<description>I&#039;m Mahdi Tajik. I am project manager and Full-stack Android developer. welcome to my personal website.</description>
	<lastBuildDate>Thu, 29 Nov 2018 14:20:36 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.6</generator>

<image>
	<url>http://www.mahditajik.ir/wp-content/uploads/2015/03/cropped-sample-logo-MT-2-32x32.png</url>
	<title>material-design &#8211; Mahdi Tajik</title>
	<link>http://www.mahditajik.ir</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>کار با CollapsingToolBar به همراه مثالی ساده</title>
		<link>http://www.mahditajik.ir/how-to-use-collapsingtoolbar/</link>
					<comments>http://www.mahditajik.ir/how-to-use-collapsingtoolbar/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Wed, 26 Apr 2017 16:44:26 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[material-design]]></category>
		<category><![CDATA[UI]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2254</guid>

					<description><![CDATA[<p>کار با CollapsingToolBar به همراه مثالی ساده حتماً شما هم افکت های زیبای Material Design را دیده اید که چگونه با اسکرول دادن لیست، toolBar و عناصر دیگر با یک افکت زیبا جمع شده و به بالا می روند. چی؟! راجع بهش می دونید و ازش استفاده می کنید؟ باشه من می خوام در این ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/how-to-use-collapsingtoolbar/">کار با CollapsingToolBar به همراه مثالی ساده</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>کار با CollapsingToolBar به همراه مثالی ساده</strong></p>
<p>حتماً شما هم افکت های زیبای <strong>Material Design</strong> را دیده اید که چگونه با اسکرول دادن لیست، <strong>toolBar</strong> و عناصر دیگر با یک افکت زیبا جمع شده و به بالا می روند. چی؟! راجع بهش می دونید و ازش استفاده می کنید؟ باشه من می خوام در این مقاله  نحوه صحیح پیاده سازی <strong>CollapsingToolBar</strong>  را  باهم برسی کرده و ابهامات احتمالی موجود در گوشه ذهنمون رو بر طرف کنم. پس چه دوستانی که با این کتابخانه آشنا هستند و چه شمایی که تازه می خواهید شروع کنید، تا آخر این مقاله با من باشید. پیشنهاد من اینکه یکبار مقاله را کامل بخوانید و بعد بروید سراغ کد. ۹۰ درصد سوالات برطرف می شود و اگر دوباره مقاله را بخوانید ۱۰ درصد بقیه نیز اوکی میشود. انشاء الله <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>&nbsp;</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2261" src="http://www.mahditajik.ir/wp-content/uploads/2017/04/video_2017-04-26_17-02-07.gif" alt="" width="360" height="640" /></p>
<p><strong>تعریف:</strong></p>
<p><strong>CollapsingToolBar</strong> یک <strong>wrapper</strong> یا غلاف برای <strong>ToolBar</strong> هست که خودش مشتق شده از <strong>AppBar</strong> است و طراحی شده تا فرزند <strong>AppBarLayout</strong> باشد. خود <strong>AppBarLayout</strong> یک <strong>LinearLayout</strong> است با این امکان که اکثر افکت ها و امکانات <strong>Material Design</strong>  در فرزند های آن قابل استفاده است و اجازه می دهد تا <strong>ToolBar</strong> و <strong>View</strong> های دیگر نسبت اسکرول شدن View های وابسته (<strong>NestedScrollView</strong> و یا <strong>RecyclerView</strong>) عکس العمل نشان بدهند و افکت های Material Design را اعمال کنند.حتماً می دانید که AppBarLayout باید والد یا parent آن <strong>CoordinatorLayout</strong> باشد. خود <strong>CoordinatoLayout</strong> نیز <strong>Super FrameLayout</strong> است که معمولا به عنوان والد اصلی لیوت ها بکار گرفته می شود. برای جلو گیری از پیچیده شدن مطلب به نمودار زیر توجه کنید:</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2259" src="http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout.jpg" alt="" width="500" height="800" srcset="http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout.jpg 500w, http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout-188x300.jpg 188w" sizes="(max-width: 500px) 100vw, 500px" /></p>
<p>خیلی خوب بیاید یکبار بالعکس دفعه قبل از بالا به پایین برسی کنیم:</p>
<p><strong>CoordinatorLayout</strong> لازم است تا بتوانیم <strong>AppBarLayout</strong> داشته باشیم. <strong>AppBarLayout</strong> هم باید باشد تا بتوانیم <strong>CollapsingToolBarLayout</strong> داشته باشیم. درون <strong>CollapsingToolBarLayout</strong> هم یک <strong>ToolBar</strong> برای برنامه می گذاریم و یک <strong>ImageView</strong>. ما می خواهیم با اسکرول خوردن لایه محتوا، کل <strong>CollapsingToolBarLayout</strong> و کامپوننت های داخل آن به جز <strong>ToolBar</strong>جمع شود. در هر کدام از این کامپوننت ها هم باید <strong>Property</strong> های مخصوص را به درستی مقدار دهی کنیم. اول اینکه در <strong>CollapsingToolBarLayout</strong> باید فلگ اسکرول را بدهیم که مشخص می کند نسبت به اسکرول لایه محتوا چه عکس العملی نشان دهد. در ضمن می توان برای <strong>ToolBar</strong> یا کامپوننت های داخل <strong>CollapsingToolBarLayout</strong> نوع جمع شدن ان را مشخص کرد که می تواند بصورت <strong>Paralex</strong> یا <strong>pin</strong> باشد. استفاده از <strong>paralex</strong> برای <strong>ImageView</strong> بسیار جالب خواهد بود و با سرعتی کمتر از سرعت اسکرول از صفحه خارج خواهد شد. ( سایت های <strong>paralex</strong> رو حتماً دیده اید!) البته گزینه <strong>pin</strong> فقط روی <strong>ToolBar</strong> کار می کند و توسط آن بعد از جمع شدن کل <strong>CollapsingToolBarLayout</strong> فقط <strong>ToolBar</strong> بالای صفحه باقی می ماند و به اصطلاح <strong>Pin</strong> می شود. البته توجه کنید که نمی توان <strong>Pin</strong> را مثلا روی <strong>ImageView</strong> اعمال کرد.</p>
<p>بسیار خوب، از طرفی هم به لایه محتوی باید بگوییم که قرار است تغییرات اسکرولش به <strong>AppBarLayout</strong> اطلاع داده شود که این امر با ست کردن <strong> layout_behavior</strong> محقق می شود.</p>
<p>همه اینها در تصویر پایین رسم کرده ام تا بسیار راحت جمع بندی کنیم.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2269" src="http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout2-1.jpg" alt="" width="1300" height="800" srcset="http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout2-1.jpg 1300w, http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout2-1-300x185.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout2-1-768x473.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2017/04/coordinatorlayout2-1-1024x630.jpg 1024w" sizes="(max-width: 1300px) 100vw, 1300px" /></p>
<p>حالا می تونید برگردید و تعریف رو دوباره بخونید. خیلی خوب! ببینیم چطور می تونیم این افکت ها را ایجاد و مدیریت کنیم. استفاده از <strong>Component</strong> های یاد شده به همراه چند <strong>Scroll_flags</strong> باعث ایجاد افکت های <strong>Scrolll</strong> می شود که بصورت زیر است:</p>
<p><strong>Scroll</strong><br />
اگر از فلگ<br />
<pre class="crayon-plain-tag">scroll</pre>
استفاده نکنیم اصلا ToolBar اسکرول نخواهد خورد و از این فلگ را معمولا با ترکیب فلگ های دیگر استفاده می کنیم.</p>
<p><strong>enterAlways</strong><br />
با استفاده از فلگ<br />
<pre class="crayon-plain-tag">enterAlways</pre>
بعد از اینکه آیتم از صفحه خارج شد با اولین اسکرول برعکس بعدی دوباره نمایان می شود. اگر از فلگ<br />
<pre class="crayon-plain-tag">scroll</pre>
به تنهایی استفاده کرده بودیم باید تمامی صفحات اسکرول شده را برگردیم تا دوباره آیتم خارج شده (ToolBar یا هر آیتمی که این فلگ به او نسبت داده شده) به صفحه باز گردد. موارد را در مثال می توانید مشاهده کنید و حتی با دانلود کل کد از gitHub تک تک آنها را خودتان امتحان نمایید. پس نگران نباشید!</p>
<p><strong>exitUntilCollapsed</strong><br />
با استفاده از این فلگ، لیست بصورتی عمل می کند که با اسکرول لیست به سمت بالا کم کم فضای آیتم را گرفته و آیتم از بالا به بیرون می رود و باید همه صفحه های اسکرول شده در<br />
<pre class="crayon-plain-tag">exitUntilCollapsed</pre>
بصورت عکس اسکرول شوند تا آیتم (ToolBar یا هر آیتمی که این فلگ به او نسبت داده شده) دوباره باز گردد. فقط حواسمان باشد که این فلگ برای CollapsingToolBar عمل می کند و برای آیتم های دیگر کارایی ندارد!</p>
<p>کد نمودار بالا بصورت زیر است:</p><pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"&gt;
    &lt;!-- fitsSystemWindows: hen enabled, the AppBarLayout assumes that the status bar is not available and it has to occupy the entire real estate. --&gt;

    &lt;android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="256dp"
        android:theme="@style/AppTheme.AppBarOverlay"&gt;

        &lt;android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingToolBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="@color/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"&gt;
            &lt;!-- * contentScrim: when collapsing the toolbar color change to this, if you want to use this feature do not set background color for toolBar --&gt;

            &lt;ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"
                android:src="@drawable/ic_back"/&gt;

            &lt;android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:elevation="7dp"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_collapseMode="pin"/&gt;

            &lt;!-- * layout_collapseMode: indicate how our tool bar act to collapsing pin on top or paralex --&gt;

        &lt;/android.support.design.widget.CollapsingToolbarLayout&gt;


    &lt;/android.support.design.widget.AppBarLayout&gt;

    &lt;include layout="@layout/content_main"/&gt;

    &lt;android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/fab_margin"
        app:layout_anchor="@id/app_bar"
        app:layout_anchorGravity="bottom|right"
        app:srcCompat="@android:drawable/ic_dialog_email"/&gt;
    &lt;!-- * layout_anchorGravity: layout_gravity should removed so the layout_anchorGravity works --&gt;
    
&lt;/android.support.design.widget.CoordinatorLayout&gt;</pre><p>
<strong>نکته۱:</strong><br />
گزینه<br />
<pre class="crayon-plain-tag">contentScrim</pre>
در<br />
<pre class="crayon-plain-tag">CollapsingToolbarLayout</pre>
باعث می شه که بعد از جمع شدن بجای استفاده از بخش مانده از تصویر به عنوان بک گراند، رنگش به رنگ مورد نظر ما تغییر بکنه. حواستون باشه این گزینه وقتی کار میکنه که شما<br />
<pre class="crayon-plain-tag">toolBar</pre>
رنگ پس زمینه نگذاشته باشین.</p>
<p><strong>نکته۲:</strong><br />
گزینه<br />
<pre class="crayon-plain-tag">layout_anchor</pre>
باعث میشه که کامپوننت های درون<br />
<pre class="crayon-plain-tag">CoordinatorLayout</pre>
بتونند به آیتم های دیگه اصطلاحاً لنگر بندازن و بهشون وصل بشوند و اتفاقات مربوط به اسکرول روی انها نیز تاثیر بگذارد. همانطور که در کد می بینید ما<br />
<pre class="crayon-plain-tag">floatingActionButton</pre>
را به<br />
<pre class="crayon-plain-tag">appBarLayout</pre>
وصل کردیم و توسط گزینه<br />
<pre class="crayon-plain-tag">layout_anchorGravity</pre>
موقعیت آن را نیز مشخص کردیم. اگر این مشخصه نبود ما باید احتمالا یک انیمیتی دستی به<br />
<pre class="crayon-plain-tag">floatingActionButton</pre>
می دادیم تازه اونم سینک کردنش با انیمیت اسکرول داستانی برای خودش. پس به راحتی می تونیم این طوری هندلش کنیم.</p>
<p>همانطور که می بینید با استفاده از کامپوننت های <strong>CollapsingToolBar </strong> و <strong>AppBarLayout</strong> و <strong>CoordinatorLayout</strong> با دادن چند Property ساده تونستیم افکت زیبای <strong>Material Design</strong> را داشته باشیم. امیدوارم این مقاله براتون مفید بوده باشه.</p>
<p>کد کامل رو از اینجا بگیرید و خودتان تست کنید.</p>
<p><a href="https://github.com/mahdit83/CollapsingToolBarDemo/tree/master" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2146" src="http://www.mahditajik.ir/wp-content/uploads/2016/12/github_download.png" alt="github_download" width="230" height="70" /></a>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/how-to-use-collapsingtoolbar/">کار با CollapsingToolBar به همراه مثالی ساده</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/how-to-use-collapsingtoolbar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آیا یک dp یک pixel است؟</title>
		<link>http://www.mahditajik.ir/supporting-multiple-screens/</link>
					<comments>http://www.mahditajik.ir/supporting-multiple-screens/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Wed, 24 Aug 2016 11:03:06 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[density]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dpi]]></category>
		<category><![CDATA[material-design]]></category>
		<category><![CDATA[تبدیل dp به px]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2039</guid>

					<description><![CDATA[<p>سلام. مبحث امروزمان در مورد پشتیبانی برنامه از گوشی ها با سایز های گوناگون می باشد. شاید برای شما هم این سوال پیش آمده باشد و هدف من یافتن پاسخ مناسبی برای این دو سوال است: که چرا برنامه من در گوشی های مختلف یکسان به نظر نمی رسد؟؟ آیا راهی علمی و نسبتاً دقیق ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/supporting-multiple-screens/">آیا یک dp یک pixel است؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">سلام. مبحث امروزمان در مورد پشتیبانی برنامه از گوشی ها با سایز های گوناگون می باشد. شاید برای شما هم این سوال پیش آمده باشد و هدف من یافتن پاسخ مناسبی برای این دو سوال است:</p>
<blockquote><p>که چرا برنامه من در گوشی های مختلف یکسان به نظر نمی رسد؟؟</p>
<p>آیا راهی علمی و نسبتاً دقیق برای پیاده سازی طرح طراح بدون سعی و خطا وجود دارد؟؟</p></blockquote>
<p style="text-align: justify;">شاید بصورت چشمی و دستی تغییراتی را اعمال می کنید و به نتیجه مطلوب می رسید و یا شاید هم مثل من برای آن راه کاری پیدا کرده اید.</p>
<p><strong>مشکل کجاست؟</strong></p>
<p style="text-align: justify;">مشکل از آنجایی پیش آمده که تولید کننده گان زیادی برای گوشی های اندروید وجود دارند و هرکدام گوشی های متنوعی با سایز گوناگون و کیفیت تصویر گوناگون تولید می کنند. این مشکل در آیفون وجود ندارد و تنوع گوشی های آن بسیار پایین است. البته ما می توانیم این تهدید را به راحتی به فرصت تبدیل کنیم. در این مقاله تلاش می کنم تا استانداردهای گوگل را باهم برسی کرده و راهکار مناسبی ارائه دهیم. پس تا آخر این مطلب با من باشید!</p>
<p>&nbsp;</p>
<p><strong>اصطلاحات و مفاهیم</strong></p>
<p style="text-align: justify;"><em>Screen density</em></p>
<p style="text-align: justify;">تراکم صفحه به معنای تعداد نقاط موجود در صفحه برای نمایش بر اینچ می باشد.(از آنجایی که اکثر واحد های اندروید به اینچ است، ما هم با همین واحد کار خواهیم کرد. ) صفحه با تراکم low یعنی صفحه ای که در فضای فیزیکی آن تعداد پیکسل های کمی در مقایسه با صفحات normal و high وجود دارد. جزو مشخصات هرگوشی یک مشخه به عنوان تراکم تصویر با واحد dpi موجود است. به عنوان مثال گوشی samsung galaxy s6 دارای تراکم پیکسلی ۵۵۷ dpi است. ( واحد dpi و ppi هردو برای تراکم هستند و در صفحه موبایل هردو به یک معنا هستند. ) این واحد ربطی به سایز صفحه ندارد و ممکن است گوشی بزرگی باشد که تعداد پیکسل های آن کم باشد و گوشی کوچکی داشته باشیم که تراکم پیکسلی بسیار بالایی داشته باشد. بالعکس آن هم صادق است.</p>
<p style="text-align: justify;"><em>Resolution</em></p>
<p style="text-align: justify;">به معنای تعداد پیکسل های فیزیکی موجود در صفحه. وقتی قرار است برنامه ای بسازیم که سازگار با صفحات نمایش مختلف باشد با رزولوشن کار نداریم، بلکه به تراکم صفحه و سایز آن کار خواهیم داشت.</p>
<p style="text-align: justify;"><em>Density-independent pixel (dp)</em></p>
<p style="text-align: justify;">واحد مجازی و جایگزین پیکسل است  از آن جهت مشخص کردن اندازه ها و فاصله ها استفاده کنیم. هدف از تعریف dp ایجاد واحدی مستقل از تراکم صفحه است تا بتوان با استفاده از آن واحد در تمامی صفحات اندازه یکسانی داشته باشیم. حال ببینیم dp از کجا امده است؟</p>
<p style="text-align: justify;">همانطور که در بالا اشاره شد تراکم های پیکسلی گوناگونی برای گوشی های اندروید وجود دارد و گوگل برای ساده کردن این تعداد زیاد، آنها را به دسته هایی تقسیم بندی کرده و یکی را یعنی ۱۶۰ dpi را به عنوان شاخص گوشی ها در نظر گرفته است. این دسته بندی به شکل زیر است:</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2044" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/1NXYH.png" alt="1NXYH" width="533" height="164" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/08/1NXYH.png 533w, http://www.mahditajik.ir/wp-content/uploads/2016/08/1NXYH-300x92.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;">بازه کامل تر با نمایی دیگر را ملاحظه فرمایید. همانطور که می بینید برای راحتی کار از هر بازه یک عدد را به عنوان نماینده آن بر می گزینیم و با آن نام صدا می زنیم. مثلا تمام گوش هایی که تراکم تصویری آنها بین ۱۰۰dpi و ۱۴۰dpi باشد از نظر ما ۱۲۰dpi بوده و در بازه ldpi یا low-dpi قرار می گیرد.<br />
<img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2045" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/android_dpi_categories_chart_2013.jpg" alt="android_dpi_categories_chart_2013" width="779" height="285" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/08/android_dpi_categories_chart_2013.jpg 779w, http://www.mahditajik.ir/wp-content/uploads/2016/08/android_dpi_categories_chart_2013-300x110.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2016/08/android_dpi_categories_chart_2013-768x281.jpg 768w" sizes="(max-width: 779px) 100vw, 779px" /></p>
<p>بازه ها بطور دقیق تر عبارتند از: ( میانگین معیار بازه تا معیار بازه بعدی )</p>
<p>ldpi    ۱۰۰ &#8211; ۱۳۹<br />
mdpi    ۱۴۰ &#8211; ۱۹۹<br />
hdpi    ۲۰۰ &#8211; ۲۷۹<br />
xhdpi   ۲۸۰ &#8211; ۳۶۹<br />
xxhdpi   ۳۷۰ &#8211; ۵۵۹<br />
xxxhdpi      ۵۶۰ &#8211; x</p>
<p style="text-align: justify;">حال بر می گردیم به تعریف dp. بسیار ساده است! <strong>یک dp برابر است با دقیقاً یک پیکسل وقتی که dpi ما ۱۶۰ باشد</strong>.  وقتی در اندازه هایمان از dp استفاده کنیم خود اندروید آن را طوری محاسبه می کند که این اندازه <strong>تقریباً</strong> در تمامی گوشی ها یکسان به نظر برسد و طبق همین گفته با تقریب خوبی همیشه یک اینچ برابر ۱۶۰dp در هر گوشی می شود.  فرمول محاسبه pixel از روی dp بدین صورت است:</p>
<p><code>px = dp * (dpi / 160)</code></p>
<p style="text-align: justify;">dp / dpi = inch پس یعنی ۱۶۰dp در در گوشی</p>
<p style="text-align: justify;">حال این به چه معنی است؟ این فرمول می گوید مثلا اگر مارجین را در طراحی ۱۶dp بدهیم در گوشی با mdpi همان ۱۶px می شود. در گوشی hdpi برای نمایش این ۱۶dp از (۱۶*(۲۴۰/۱۶۰)) = ۲۴px استفاده می کند تا طرح ما یکسان به نظر برسد. زیرا ضریب تراکم ما ۱ شد که ضربدر تعداد پیکسل به ۲۴ رسیدیم. با قرار دادن dpi ها در فرمول به ضرایب زیر می رسیم:</p>
<ul>
<li><strong>ldpi</strong> = 0.00625 * <a href="http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_LOW">120</a> -&gt; <strong>0.75</strong></li>
<li><strong>mdpi</strong> = 0.00625 * <a href="http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_MEDIUM">160</a> -&gt; <strong>1.0</strong></li>
<li><strong>hdpi</strong> = 0.00625 * <a href="http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_HIGH">240</a> -&gt; <strong>1.5</strong></li>
<li><strong>xhdpi</strong> = 0.00625 * <a href="http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_XHIGH">320</a> -&gt; <strong>2.0</strong></li>
<li><strong>xxhdpi</strong> = 0.00625 * <a href="http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_XXHIGH">480</a> -&gt; <strong>3.0</strong></li>
<li><strong>xxxhdpi</strong> = 0.00625 * <a href="http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_XXXHIGH">640</a> -&gt; <strong>4.0</strong></li>
</ul>
<p>&nbsp;</p>
<p><strong>راهکار چیست؟<br />
</strong></p>
<p style="text-align: justify;">حال وقت آن می رسد که با دانستن اطلاعات بالا راهی مناسب جهت پیاده سازی برنامه در گوشی با صفحه نمایش های مختلف پیدا کنیم. راهی که خود گوگل پیشنهاد می دهد این است:</p>
<p><strong>Explicitly declare in the manifest which screen sizes your application supports</strong></p>
<p style="text-align: justify;">یک راه این است که در خود مانیفست صریحاً بگوییم که چه صفحه هایی پشتیبانی می کنیم. البته توجه کنید که تاثیر این فیلتر  در مارکت خواهد بود و در صورت نصب از طرق دیگر عمل نخواهد کرد.</p>
<pre class="crayon-plain-tag">&lt;supports-screens android:xlargeScreens="true" /&gt;</pre>
که می گوید در گوشی های بزرگ قابل دسترس باشد و یا مثال دیگر:<br />
<pre class="crayon-plain-tag">&lt;supports-screens android:compatibleWidthLimitDp="320" /&gt;</pre>
<p style="text-align: justify;">که می گوید کوچکترین عرض ممکن ۳۲۰dp خواهد بود و در گوشی هایی که این شرایط را ندارند قابل ارائه نخواهد بود. مثلا با کد زیر برنامه ما فقط برای تبلت ها قابل دسترس خواهد کرد.</p>
<pre class="crayon-plain-tag">&lt;compatible-screens android:smallScreens="false"
                  android:normalScreens="false"
                  android:largeScreens="true"
                  android:xlargeScreens="true"
                  android:requiresSmallestWidthDp="600" /&gt;</pre>
اطلاعات بیشتر در <a href="https://developer.android.com/guide/practices/screen-compat-mode.html" target="_blank" rel="noopener">گوگل</a>.</p>
<p>&nbsp;</p>
<p><strong>Provide different layouts for different screen sizes</strong></p>
<p style="text-align: justify;">بصورت پیش فرض اندروید layout ها و چیدمان ها را بر اساس سایز صفحه تغییر سایز می دهد. این تغییر اکثرا مشکلی ندارد اما در برخی موارد ممکن است خوب به نظر نرسد و لازم باشد که اندازه ها و چیده مان ها تغییر کنند. برای همین امر فولدر هایی داریم که می توان بر اساس آنها لیوت های گوناگون داشته باشیم تا در شرایط مختلف بر اساس سایز تصویر، مورد استفاده قرار گیرند. برای این کار کافی است که layout های مختلف را با نام یکسان در فولدرهای مختلف قرار دهیم. به عنوان مثال می توانید main.xml را با طراحی دیگر برای تبلت داخل فولدر  layout-sw600 قرار دهید و با این کار به اندروید می گوییم که اگر حداقل عرض صفحه ۶۰۰dp بود از layout های داخل این فولدر استفاده کن.</p>
<p>&nbsp;</p>
<p><strong>Provide different bitmap drawables for different screen densities</strong></p>
<p style="text-align: justify;">بطور پیش فرض اندروید تصاویر شما را جهت نمایش در سایز های گوناگون تغییر سایز می دهد. ولی همانطور که می دانیم این امر سبب می شود تا کیفیت نمایشمان خیلی خوب نباشد. بهتر این است که ورژن های متفاوتی از تصاویر و بیتمپ هایمان را در سایز های گوناگون قرار دهیم تا اندروید با توجه به dpi صفحه مناسب ترین را جهت استفاده انتخاب و با کمترین تغییر سایز مورد استفاده قرار دهد. همانطور که پیش تر گفتیم چون dpi ها دارای رنج هستند یعنی مثلاً از ۱۴۱dpi تا ۲۰۰dpi جزو ۱۶۰dpi قرار می گیرند و منابع یکسانی استفاده می شود، لذا ممکن است در گوشی ۲۰۰dpi یک تصویر کمی کشیده شده و سپس مورد استفاده قرار گیرد.</p>
<p>روش استفاده از منابع توسط اندروید بدین صورت است:</p>
<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2056" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/res-selection-flowchart.png" alt="res-selection-flowchart" width="361" height="461" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/08/res-selection-flowchart.png 361w, http://www.mahditajik.ir/wp-content/uploads/2016/08/res-selection-flowchart-235x300.png 235w" sizes="(max-width: 361px) 100vw, 361px" /></p>
<p>۱- اول سیستم باتوجه به dpi گوشی وارد فولدر منابع می شود و اگر بتواند منابع را از داخل آن بر می دارد. به این پوشه ها توصیف کننده های اندازه می گویند. ( size qualifiers ) اگر نتوانست وارد پوشه منابع با اولویت بعدی می شود. سپس درصورت نیاز با اعمال تغییر سایز اندک مورد استفاده قرار می دهد. پوشه های منابع drawable بصورت زیر نامگذاری می شوند:</p><pre class="crayon-plain-tag">drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/</pre><p>
<p style="text-align: justify;">که بخش های آن عبارتند از:</p>
<p style="text-align: justify;">Locale = en-GB<br />
Screen orientation = port<br />
Screen pixel density = hdpi<br />
Touchscreen type = notouch<br />
Primary text input method = 12key</p>
<p style="text-align: justify;">۲- درصورتی که منبع مورد نظر در dpi ما یافت نشد، اندروید تصویر پیش فرض را بر می دارد و با تغییر سایز از آن استفاده می کند. منظور از پیش فرض همان منابعی هستند که در پوشه <span class="highlight">drawable/</span> قرار گرفته اند.</p>
<p style="text-align: justify;">فولدر هایی که برای منابع می توانیم استفاده کنیم به شرح ذیل است. کافی است که یک تصویر را در سایز های مورد نیاز با نام یکسان در پوشه های مورد نیاز قرار دهیم.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2054" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers.jpg" alt="Configuration qualifiers" width="952" height="827" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers.jpg 952w, http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-300x261.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-768x667.jpg 768w" sizes="(max-width: 952px) 100vw, 952px" /></p>
<p>مثال:</p><pre class="crayon-plain-tag">res/layout/my_layout.xml              // layout for normal screen size ("default")
res/layout-large/my_layout.xml        // layout for large screen size
res/layout-xlarge/my_layout.xml       // layout for extra-large screen size
res/layout-xlarge-land/my_layout.xml  // layout for extra-large in landscape orientation

res/drawable-mdpi/graphic.png         // bitmap for medium-density
res/drawable-hdpi/graphic.png         // bitmap for high-density
res/drawable-xhdpi/graphic.png        // bitmap for extra-high-density
res/drawable-xxhdpi/graphic.png       // bitmap for extra-extra-high-density

res/mipmap-mdpi/my_icon.png         // launcher icon for medium-density
res/mipmap-hdpi/my_icon.png         // launcher icon for high-density
res/mipmap-xhdpi/my_icon.png        // launcher icon for extra-high-density
res/mipmap-xxhdpi/my_icon.png       // launcher icon for extra-extra-high-density
res/mipmap-xxxhdpi/my_icon.png      // launcher icon for extra-extra-extra-high-density</pre><p>
<p style="text-align: justify;">توصیف کننده های جدیدی وجود دارند که بر اساس dp هستند. مثلا sw600dp می گوید دیوایس هایی که حد اقل عرض آنها ۶۰۰dp باشد. ( فرمول تبدیل dp  از روی dpi و تعداد px را در اوایل مقاله گفته ایم.)</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-large wp-image-2058" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-new-1024x987.jpg" alt="Configuration qualifiers new" width="620" height="598" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-new-1024x987.jpg 1024w, http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-new-300x289.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-new-768x740.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2016/08/Configuration-qualifiers-new.jpg 1030w" sizes="(max-width: 620px) 100vw, 620px" /></p>
<p><code>dp = px / (dpi / 160)</code></p>
<p>و کد آن:</p><pre class="crayon-plain-tag">private void showDensity() {
    
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    float width = size.x;
    float height = size.y;
    
    Log.i("MAHDI","Screen width="+dpFromPx(this,width)+" dp");

}

public static float dpFromPx(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

public static float pxFromDp(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}</pre><p>
اگر بخواهیم دیوایس ها را بر اساس عرض به dp تقسیم بندی کنیم:</p><pre class="crayon-plain-tag">320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
480dp: a tweener tablet like the Streak (480x800 mdpi).
600dp: a 7” tablet (600x1024 mdpi).
720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).</pre><p>
و مثال:</p><pre class="crayon-plain-tag">res/layout/main_activity.xml           # For handsets (smaller than 600dp available width)
res/layout-sw600dp/main_activity.xml   # For 7” tablets (600dp wide and bigger)
res/layout-sw720dp/main_activity.xml   # For 10” tablets (720dp wide and bigger)</pre><p>
<p style="text-align: justify;">البته موارد بیشتری نیز وجود دارد که لیست تمامی توصیف کننده ها می توانید در <span class="highlight"><a href="https://developer.android.com/guide/topics/resources/providing-resources.html" target="_blank" rel="noopener">اینجا </a></span>ببینید.</p>
<p style="text-align: justify;">چند نکته با اهمیت وجود دارد. اول اینکه اگر سیستم منابع را در فولدر مناسب سیتم پیدا نکند و ما منابع جایگزین را نداشته باشیم، سیستم دنبال مناسب ترین گزینه ممکن می گردد. نکته دیگر اینکه اگر  تمام منابع را در جایی خارج از فولدر پیش فرض بگذاریم مثلا همه تصاویر را در xlarge قرار دهیم و اگر گوشی normal-size باشد در هنگام اجرای برنامه کرش می کند.</p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>راهکار پیشنهادی</strong></p>
<p style="text-align: justify;">پیشنهاد خود گوگل این است که:</p>
<ol>
<li style="text-align: justify;">استفاده از wrap_content، match_parent و  dp برای مشخص کردن ابعاد در xml فایل های layout</li>
<li style="text-align: justify;">عدم استفاده از واحد پیکسل آن هم بصورت هارد کد شده. ( یعنی ثابت :: مثلا ۱۰۰px )</li>
<li style="text-align: justify;">عدم استفاده از AbsoluteLayout که البته منسوخ شده است.</li>
<li style="text-align: justify;">فراهم کردن تصاویر جایگزین در سایزهای گوناگون برای صفحه نمایش های مختلف.</li>
</ol>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>چطور طراحی را  پیاده سازی کنیم؟ تبدیل پیکسل از فتوشاپ به dp</strong></p>
<p style="text-align: justify;">بعد از دانستن مطالب بالا نوبت آن می رسد که بدانیم در طراحی واحدها را چگونه انتخاب کنیم تا پیداه سازی آن در گوشی بسیار راحت باشد؟ بهتر است بگوییم <strong>در این بخش می خواهیم ارتباط درستی با طراح داشته باشیم تا بعد از طراحی نیازی به سعی و خطا جهت بدست آوردن اندازه طرح داده شده نباشیم</strong>!</p>
<p style="text-align: justify;">بسیار ساده است! ببینید آیا خودتان پیشنهادی دارید؟ روی این قضیه کمی تامل کنید و سپس ادامه مطلب را مشاهده فرمایید&#8230;</p>
<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2074" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/android2.jpg" alt="android2" width="700" height="347" /></p>
<ol>
<li style="text-align: justify;">سایز گوشی که به عنوان معیار در دست دارید را به اینچ حساب کنید. ppi یا dpi آن هم مشخص است. ( مثلاً galaxy s6 557dpi است و اندازه آن ۴٫۵in در ۲٫۵in )</li>
<li style="text-align: justify;">در فوتوشاپ یک فایل جدید به اندازه سایز گوشی با اینچ درست کنید با تراکم پیکسلی گوشی. ( یعنی ۵۵۷ pixel/inch )</li>
<li style="text-align: justify;">حال هر طرحی زده شود هر پیکسل آن معادل یک dp است. بنابر این اگر طراح بخواهد فاصله ها را به پیکسل بدهد شما به راحتی می توانید همان اعداد را با واحد dp جایگزین کنید.</li>
<li style="text-align: justify;">از آنجا که گوشی شما در منطقه xxxhdpi قرار دارد یعنی دارای ضریب ۴ است. البته سایز های به dp هیچ نیازی به تغییر سایز ندارند و کار دولوپر با استفاده از واحد dp تقریباً تمام است و از اینجا به بعد گرافیست باید فایل های جایگزین را با در نظر گرفتن ضریب برای دسته بسازد. یعنی برای بدست آوردن xxhdpi کافی است تمامی فایل ها را ضرب در ۳/۴ بکنیم. اگر تصویری داریم که سایز آن ۴۰۰ در ۴۰۰ است رای تغییر سایز آن برای فولدرهای دیگر به این صورت می شود و تمامی این زحمات به عهده گرافیست است:</li>
</ol>
<table class="s-tag-table">
<tbody>
<tr>
<td colspan="1" rowspan="1"><strong>Screen resolution</strong></td>
<td colspan="1" rowspan="1"><strong>dpi</strong></td>
<td colspan="1" rowspan="1"><strong>Pixel ratio</strong></td>
<td colspan="1" rowspan="1"><strong>Image size (pixels)</strong></td>
</tr>
<tr>
<td colspan="1" rowspan="1">xxxhdpi</td>
<td colspan="1" rowspan="1">۶۴۰</td>
<td colspan="1" rowspan="1">۴٫۰</td>
<td colspan="1" rowspan="1">۴۰۰&#215;۴۰۰</td>
</tr>
<tr>
<td colspan="1" rowspan="1">xxhdpi</td>
<td colspan="1" rowspan="1">۴۸۰</td>
<td colspan="1" rowspan="1">۳٫۰</td>
<td colspan="1" rowspan="1">۳۰۰&#215;۳۰۰</td>
</tr>
<tr>
<td colspan="1" rowspan="1">xhdpi</td>
<td colspan="1" rowspan="1">۳۲۰</td>
<td colspan="1" rowspan="1">۲٫۰</td>
<td colspan="1" rowspan="1">۲۰۰&#215;۲۰۰</td>
</tr>
<tr>
<td colspan="1" rowspan="1">hdpi</td>
<td colspan="1" rowspan="1">۲۴۰</td>
<td colspan="1" rowspan="1">۱٫۵</td>
<td colspan="1" rowspan="1">۱۵۰&#215;۱۵۰</td>
</tr>
<tr>
<td colspan="1" rowspan="1">mdpi</td>
<td colspan="1" rowspan="1">۱۶۰</td>
<td colspan="1" rowspan="1">۱٫۰</td>
<td colspan="1" rowspan="1">۱۰۰&#215;۱۰۰</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>مثلا اگر تصویری استفاده کردیم که سایز اصلی آن در photoshop  به ۳۴۰&#215;۵۴۰ است برای تغییر سایز آن برای فولدرهای دیگر به این صورت می شود :</p>
<table class="s-tag-table">
<tbody>
<tr>
<td colspan="1" rowspan="1"><strong>Screen resolution</strong></td>
<td colspan="1" rowspan="1"><strong>dpi</strong></td>
<td colspan="1" rowspan="1"><strong>Pixel ratio</strong></td>
<td colspan="1" rowspan="1"><strong>Image size (pixels)</strong></td>
</tr>
<tr>
<td colspan="1" rowspan="1">xxxhdpi</td>
<td colspan="1" rowspan="1">۶۴۰</td>
<td colspan="1" rowspan="1">۴٫۰</td>
<td colspan="1" rowspan="1">۳۴۰&#215;۵۴۰</td>
</tr>
<tr>
<td colspan="1" rowspan="1">xxhdpi</td>
<td colspan="1" rowspan="1">۴۸۰</td>
<td colspan="1" rowspan="1">۳٫۰</td>
<td colspan="1" rowspan="1">۲۵۵&#215;۴۰۵</td>
</tr>
<tr>
<td colspan="1" rowspan="1">xhdpi</td>
<td colspan="1" rowspan="1">۳۲۰</td>
<td colspan="1" rowspan="1">۲٫۰</td>
<td colspan="1" rowspan="1">۱۷۰&#215;۲۷۰</td>
</tr>
<tr>
<td colspan="1" rowspan="1">hdpi</td>
<td colspan="1" rowspan="1">۲۴۰</td>
<td colspan="1" rowspan="1">۱٫۵</td>
<td colspan="1" rowspan="1">۱۲۷&#215;۲۰۲</td>
</tr>
<tr>
<td colspan="1" rowspan="1">mdpi</td>
<td colspan="1" rowspan="1">۱۶۰</td>
<td colspan="1" rowspan="1">۱٫۰</td>
<td colspan="1" rowspan="1">۸۵&#215;۱۳۵</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>نکته:</strong> یک نکته ای که وجود دارد این است که اندازه های انتخاب شده با تقریب خوبی درهمه دستگاه ها یکسان است. بخاطر اینکه dp بطور تقریبی است. چرا دقیق نیست؟ دلیل این است که برای dpi ها از بازه استفاده کردیم.  یعنی گفته ایم از ۱۴۰dpi تا ۱۹۹dpi را یکی و mdpi در نظر بگیر و همچنین بازه های دیگر. بله اگر تراکم ما دقیقاً ۱۶۰dpi باشد یک پیکسل و یک dp برابر می شود. اما فرض کنید در گوشی متفاوت که هردو در بازه ۲۴۰dpi یعنی hdpi هستند و یکی در مرز بالا یعنی مثلا ۲۷۹dpi قرار دارد و دیگری در مرز پایین یعنی ۲۰۰dpi در همه اینها نیز یک پیکسل یک dp در نظر گرفته می شود که همین امر باعث اییجاد اندازه تقریبی می شود. می دانیم طبق تعریف های انجام شده هر دو دریک بازه قرار می گیرند و از یک فرمول تبعیت می کنند. حال اگر طرحی داشته باشیم ۳۰۰dp باشد با فرمول dp/dpi = inch * 2.5 = cm  در اولی ۳۰۰/۲۷۹=۲٫۶۸cm و در دومی ۳۰۰/۲۰۰=۳٫۷۵cm که این اختلاف حدود <strong>یک سانتی متر</strong> وجود دارد. درصورتی که قرار بود اگر از dp استفاده کنیم در همه جا اندازه نمایشی یکسان باشد! پس بدانید که اگر کمی اختلاف بود بخاطر همین تقریب است. البته از نظر گوگل این قضیه ایرادی نداشته و در این مقاله فرض را بر این می گذاریم که آن تغییر و خطای ناشی از بازه ها را نادیده گرفتیم.</p>
<p>&nbsp;</p>
<p><strong>جمع بندی</strong></p>
<p style="text-align: justify;">همانطور که ملاحظه کردید می توان طوری طراحی را انجام داد که آن طراحی در گوشی های گوناگون یکسان دیده شود. بحث دیگری که داریم این است که گاهی لازم است اندازه ها یکسان نباشد. فرض کنید با استفاده از مطالب یاد شده کاری کردیم که دکمه ما در همه صفحه ها به یک نسبت و کاملا مطابق طراحی شد. اما در یک تبلت ۱۰ اینچی آیا یک دکمه بزرگ معنی خواهد داشت؟ و یا اینکه فرض کنید طوری طراحی کردیم که ۱۰ عدد آیتم صفحه قرار گیرد. در گوشی مبدا ۱۰ آیتم بسیار مناسب و خوب است اما در یک صفحه کوچک ۱۰ تا ایتم باعث می شود که آنقدر کوچک باشند که دیدن و یا انتخاب آنها بسیار سخت خواهد شد! پس یکسان نگه داشتن سایز و نسبت همیشه درست نیست و گاهی اوقات باید کلا طراحی و سایز ها عوض شوند. یعنی در فولدرهای منابع، dimension و layout های مختلفی قرار گیرند.</p>
<p>&nbsp;</p>
<p>منابع:</p>
<p>https://developer.android.com/guide/practices/screens_support.html</p>
<p>https://developer.android.com/guide/practices/screen-compat-mode.html</p>
<p>https://developer.android.com/guide/practices/screens-distribution.html</p>
<p>https://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html</p>
<p>https://developer.android.com/training/multiscreen/screendensities.html</p>
<p>https://developer.android.com/guide/topics/resources/providing-resources.html</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/supporting-multiple-screens/">آیا یک dp یک pixel است؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/supporting-multiple-screens/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
	</channel>
</rss>
