{"id":232477,"date":"2014-08-06T18:09:03","date_gmt":"2014-08-06T14:09:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=232477"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=232477","title":{"rendered":"<span class=\"post_title\">Photo Widget \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438<\/span>"},"content":{"rendered":"<div class=\"content html_format\">     \t<img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/366\/85c\/c6c\/36685cc6c5ac4274896ded48eb2d95cc.png\"\/><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0445\u0430\u0431\u0440\u0430\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e. \u041c\u043e\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e <a href=\"http:\/\/habrahabr.ru\/post\/220689\/\">\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438<\/a> \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043c\u0430\u043b\u043e \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u043e \u0435\u0451 \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0445, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0432 \u043c\u0435\u043d\u044f \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u043d\u0435\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0442\u0435\u043c\u0443.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u0432 Xperia \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0430\u043d\u0434\u0440\u043e\u0438\u0434, \u044d\u0442\u043e \u043d\u0435 AppWidget, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 View, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0432\u0438\u0434\u0436\u0435\u0442. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0442\u044f\u0436\u043a\u043e\u0439 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u00ab\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c\u00bb \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u0443 Xperia Home, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u043e\u0432 \u0435\u0433\u043e \u043d\u0435\u0442. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u0432\u0438\u0434\u0436\u0435\u0442.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0434\u043b\u044f \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c). \u0422\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0430\u0448 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043d\u0430 \u0444\u043e\u043d\u0435 \u0434\u0440\u0443\u0433\u0438\u0445. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u043c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 Xperia, \u043d\u0430\u0448 \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 View, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u0430.<\/p>\n<h4>\u041e\u0441\u043d\u043e\u0432\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430<\/h4>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u0430\u0448 (\u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u043d\u0435 \u0432\u0438\u0434\u0436\u0435\u0442). \u0412 Sony Ericsson \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0435, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u00abcom.sonyericsson.advancedwidget\u00bb \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0438\u043a\u043e\u043d\u043a\u0443 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u043e\u0434\u0438\u043d apk \u2014 \u043e\u0434\u0438\u043d \u0432\u0438\u0434\u0436\u0435\u0442. \u041c\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0443\u043c\u043d\u0435\u0435 (\u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c) \u2014 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;receiver android:name=&quot;.PhotoWidgetReceiver&quot; &gt; \t&lt;intent-filter&gt; \t\t&lt;action android:name=&quot;by.arriva.ADVANCED_WIDGET&quot; \/&gt; \t&lt;\/intent-filter&gt; &lt;\/receiver&gt; <\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 PhotoWidgetReceiver \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0443\u0441\u0442\u044b\u043c:<\/p>\n<pre><code class=\"java\">public class PhotoWidgetReceiver extends BroadcastReceiver { \t \t@Override \tpublic void onReceive(Context context, Intent intent) {\t \t} } <\/code><\/pre>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u044e\u043a\u0443 \u043d\u0430\u0448 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043d\u0430\u0439\u0434\u0435\u0442 \u0432\u0441\u0435 BroadcastReciever&#8217;\u044b, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u043d\u0430 \u00abby.arriva.ADVANCED_WIDGET\u00bb. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 \u0438\u0437 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u0430.<\/p>\n<pre><code class=\"java\">final PackageManager manager = getPackageManager(); Intent i = new Intent(&quot;by.arriva.ADVANCED_WIDGET&quot;); List&lt;ResolveInfo&gt; lri = manager.queryBroadcastReceivers(i, 0); for(ResolveInfo ri : lri){ \tString packageName = ri.activityInfo.packageName; \tString className = ri.activityInfo.name; \tclassName = className.replace(&quot;Receiver&quot;, &quot;&quot;); \tAdvancedWidgetInfo awi = new AdvancedWidgetInfo(this, packageName, className); \tif(!awi.isValid) continue; \t\ttry { \t\t\tWidgetInfo wi = new WidgetInfo(true, awi.label, awi.width+&quot; x &quot;+awi.height, manager.getResourcesForApplication(packageName).getDrawable(awi.preview), new ComponentName(packageName, className)); \t\t\twidgetsSorted.add(wi); \t\t} catch (Exception e) {} \t\tawi = null; \t} lri.clear(); <\/code><\/pre>\n<p>  String className \u2014 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0442 BroadcastReciever, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e PhotoWidgetReceiver. \u041b\u0430\u0443\u043d\u0447\u0435\u0440 \u0438\u0449\u0435\u0442 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 PhotoWidget, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u0430. \u0412\u043e\u0442 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"java\">public class PhotoWidget { \t \tpublic static View getView(Context context){ \t\tWidgetView wv = new WidgetView(context); \t\treturn wv; \t} \t \tpublic static int getCellWidth(Context context){ \t\treturn 2; \t} \t \tpublic static int getCellHeight(Context context){ \t\treturn 2; \t} \t \tpublic static String getLabel(Context context){ \t\treturn context.getString(R.string.app_name); \t} \t \tpublic static int getIconId(Context context){ \t\treturn R.drawable.icon; \t} \t \tpublic static int getPreviewId(Context context){ \t\treturn R.drawable.preview; \t} } <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u0430\u0448\u0438\u0445 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 (advanced) \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u0445, \u0442.\u043a. \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 AdvancedWidgetInfo \u0432\u0430\u0448\u0435\u0433\u043e \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u0430.<\/p>\n<h4>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e View<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public class WidgetView extends View { \t \tContentObserver observer; \tGestureDetector gd; \tScroller scroller; \tNinePatchDrawable frame; \tBitmap loading; \tBitmap broken; \tItem[] items = null; \tfloat touchLastY = 0; \tfloat touchDownY = 0; \tboolean touchTap = false; \tboolean touchScroll = false; \tlong loaderId = -1; \tint getScrollY = 0; \tint width = 160; \tint height = 200; \t \tpublic WidgetView(Context context) { \t\tsuper(context); \t\tgd = new GestureDetector(context, new GestureListener()); \t\tscroller = new Scroller(context); \t\tobserver = new ContentObserver(new Handler()){ \t\t\t@Override \t\t\tpublic void onChange(boolean selfChange){ \t\t\t\tsuper.onChange(selfChange); \t\t\t\tloadThumbnails(); \t\t\t} \t\t}; \t\tframe = (NinePatchDrawable)getResources().getDrawable(R.drawable.frame); \t\tloading = getBmp(R.drawable.loading); \t\tbroken = getBmp(R.drawable.broken); \t} \t \t@Override \tpublic void onAttachedToWindow(){ \t\tsuper.onAttachedToWindow(); \t\tloadThumbnails(); \t\tgetContext().getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, observer); \t\tgetContext().getContentResolver().registerContentObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, observer); \t} \t \t@Override \tpublic void onDetachedFromWindow(){ \t\tsuper.onDetachedFromWindow(); \t\tgetContext().getContentResolver().unregisterContentObserver(observer); \t} \t \t@Override \tprotected void onDraw(Canvas canvas){ \t\tsuper.onDraw(canvas); \t\tPaint p = new Paint(); \t\tp.setDither(true);     \t\tp.setFilterBitmap(true); \t\tint pos = getSelected(); \t\tfloat percent = getSelectedPercent(); \t\tif(items != null){ \t\t\tif(items.length == 0){ \t\t\t\tBitmap camera = getBmp(R.drawable.camera); \t\t\t\tTransformation transform = new Transformation(0, percent, 160, 140); \t\t\t\tp.setAlpha(transform.alpha); \t\t\t\tcanvas.drawBitmap(camera, transform.matrix3d, p); \t\t\t\treturn; \t\t\t} \t\t\tif(pos &gt;= 1){ \t\t\t\tif(items[pos-1] != null){ \t\t\t\t\tif(items[pos-1].thumbnail != null){ \t\t\t\t\t\tBitmap thumbnail = items[pos-1].thumbnail; \t\t\t\t\t\tTransformation transform = new Transformation(-1, percent, thumbnail.getWidth(), thumbnail.getHeight()); \t\t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\t\tcanvas.drawBitmap(thumbnail, transform.matrix3d, p); \t\t\t\t\t} else { \t\t\t\t\t\tTransformation transform = new Transformation(-1, percent, broken.getWidth(), broken.getHeight()); \t\t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\t\tcanvas.drawBitmap(broken, transform.matrix3d, p); \t\t\t\t\t} \t\t\t\t} else { \t\t\t\t\tTransformation transform = new Transformation(-1, percent, loading.getWidth(), loading.getHeight()); \t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\tcanvas.drawBitmap(loading, transform.matrix3d, p); \t\t\t\t} \t\t\t} \t\t\tif(items.length-1 &gt;= pos+1){ \t\t\t\tif(items[pos+1] != null){ \t\t\t\t\tif(items[pos+1].thumbnail != null){ \t\t\t\t\t\tBitmap thumbnail = items[pos+1].thumbnail; \t\t\t\t\t\tTransformation transform = new Transformation(1, percent, thumbnail.getWidth(), thumbnail.getHeight()); \t\t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\t\tcanvas.drawBitmap(thumbnail, transform.matrix3d, p); \t\t\t\t\t} else { \t\t\t\t\t\tTransformation transform = new Transformation(1, percent, broken.getWidth(), broken.getHeight()); \t\t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\t\tcanvas.drawBitmap(broken, transform.matrix3d, p); \t\t\t\t\t} \t\t\t\t} else { \t\t\t\t\tTransformation transform = new Transformation(1, percent, loading.getWidth(), loading.getHeight()); \t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\tcanvas.drawBitmap(loading, transform.matrix3d, p); \t\t\t\t} \t\t\t} \t\t\tif(items.length-1 &gt;= pos){ \t\t\t\tif(items[pos] != null){ \t\t\t\t\tif(items[pos].thumbnail != null){ \t\t\t\t\t\tBitmap thumbnail = items[pos].thumbnail; \t\t\t\t\t\tTransformation transform = new Transformation(0, percent, thumbnail.getWidth(), thumbnail.getHeight()); \t\t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\t\tcanvas.drawBitmap(thumbnail, transform.matrix3d, p); \t\t\t\t\t} else { \t\t\t\t\t\tTransformation transform = new Transformation(0, percent, broken.getWidth(), broken.getHeight()); \t\t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\t\tcanvas.drawBitmap(broken, transform.matrix3d, p); \t\t\t\t\t} \t\t\t\t} else { \t\t\t\t\tTransformation transform = new Transformation(0, percent, loading.getWidth(), loading.getHeight()); \t\t\t\t\tp.setAlpha(transform.alpha); \t\t\t\t\tcanvas.drawBitmap(loading, transform.matrix3d, p); \t\t\t\t} \t\t\t} \t\t} else { \t\t\tTransformation transform = new Transformation(0, 0, loading.getWidth(), loading.getHeight()); \t\t\tcanvas.drawBitmap(loading, transform.matrix3d, null); \t\t} \t} \t \t@Override \tpublic boolean onTouchEvent(MotionEvent me) { \t\tif(items == null) return true; \t\tgd.onTouchEvent(me); \t\tfloat touchY = me.getY(); \t\tif(me.getAction() == MotionEvent.ACTION_DOWN){ \t\t\tif(!scroller.isFinished()){ \t\t\t\tscroller.abortAnimation(); \t\t\t} else { \t\t\t\ttouchTap = true; \t\t\t\ttouchScroll = false; \t\t\t} \t\t\ttouchDownY = touchLastY = touchY; \t\t} else if(me.getAction() == MotionEvent.ACTION_MOVE){ \t\t\tif(Math.abs(touchY - touchDownY) &gt; ViewConfiguration.getTouchSlop() || touchScroll){ \t\t\t\tgetParent().requestDisallowInterceptTouchEvent(true); \t\t\t\ttouchTap = false; \t\t\t\ttouchScroll = true; \t\t\t\tgetScrollY += -(int)(touchY - touchLastY); \t\t\t\tcomputeOverscroll(); \t\t\t} \t\t\ttouchLastY = touchY; \t\t} else if((me.getAction() == MotionEvent.ACTION_UP || me.getAction() == MotionEvent.ACTION_CANCEL) && scroller.isFinished()){ \t\t\tif(touchTap && me.getAction() == MotionEvent.ACTION_UP){ \t\t\t\ttap(); \t\t\t} \t\t\tsetSelected(getSelected(), true); \t\t\tgetParent().requestDisallowInterceptTouchEvent(false); \t\t} \t\treturn true; \t} \t \t@Override \tpublic void computeScroll(){ \t\tif(scroller.computeScrollOffset()){ \t\t\tint oldY = getScrollY; \t\t\tgetScrollY = scroller.getCurrY(); \t\t\tif(oldY != getScrollY){ \t\t\t\tonScrollChanged(0, getScrollY, 0, oldY); \t\t\t} \t\t\tif(scroller.getFinalY() == getScrollY){ \t\t\t\tscroller.abortAnimation(); \t\t\t\tsetSelected(getSelected(), true); \t\t\t} \t\t\tpostInvalidate(); \t\t} \t} \t \t@Override \tprotected void onMeasure(int wms, int hms){ \t\twidth = MeasureSpec.getSize(wms); \t\theight = MeasureSpec.getSize(hms); \t\tsuper.onMeasure(wms, hms); \t} \t \t@Override \tprotected void onSizeChanged(int w, int h, int oldw, int oldh){ \t\twidth = w; \t\theight = h; \t\tsuper.onSizeChanged(w, h, oldw, oldh); \t} \t \tvoid loadThumbnails(){ \t\titems = null; \t\tgetScrollY = 0; \t\tinvalidate(); \t\tThread loader = new Thread(new Runnable() { \t\t\tpublic void run() { \t\t\t\tlong currentId = Thread.currentThread().getId(); \t\t\t\ttry{ \t\t\t\t\tfinal ArrayList&lt;MediaItem&gt; list = mediaList(); \t\t\t\t\tif(list == null || loaderId != currentId) return; \t\t\t\t\titems = new Item[list.size()]; \t\t\t\t\tpostInvalidate(); \t\t\t\t\tfor(int i=0; i&lt;list.size(); i++){  \t\t\t\t\t\tif(items == null || loaderId != currentId) return; \t\t\t\t\t\titems[i] = new Item(list.get(i).path, getBmp(list.get(i)), list.get(i).type); \t\t\t\t\t\tpostInvalidate(); \t\t\t\t\t} \t\t\t\t} catch(Exception e){} \t\t\t} \t\t}); \t\tloaderId = loader.getId(); \t\tloader.start(); \t} \t \tint getSelected(){ \t\treturn Math.round(getScrollY\/140f); \t} \t \tfloat getSelectedPercent(){ \t\tfloat f = getScrollY\/140f; \t\treturn f-getSelected(); \t} \t \tvoid setSelected(int pos, boolean anim){ \t\tif(anim && getScrollY!=pos*140){ \t\t\tscroller.startScroll(0, getScrollY, 0, pos*140-getScrollY, 250); \t\t} else { \t\t\tgetScrollY = pos*140; \t\t} \t\tinvalidate(); \t} \t \tvoid computeOverscroll(){ \t\tif(getScrollY &lt; -50){ \t\t\tgetScrollY = -50; \t\t} else if(getScrollY &gt; Math.max(items.length-1, 0)*140+50){ \t\t\tgetScrollY = Math.max(items.length-1, 0)*140+50; \t\t} \t\tinvalidate(); \t} \t \tvoid tap(){ \t\ttry{ \t\t\tif(items != null){ \t\t\t\tif(items.length == 0){ \t\t\t\t\tIntent i = new Intent(&quot;android.media.action.IMAGE_CAPTURE&quot;); \t\t\t\t\ti.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); \t\t\t\t\tgetContext().startActivity(i); \t\t\t\t\treturn; \t\t\t\t} \t\t\t\tif(items[getSelected()] == null) return; \t\t\t\tint type = items[getSelected()].type; \t\t\t\tString path = items[getSelected()].path; \t\t\t\tif(type == 1){ \t\t\t\t\tIntent view = new Intent(android.content.Intent.ACTION_VIEW); \t        \t\tFile imageFile = new File(path); \t        \t\tview.setDataAndType(Uri.fromFile(imageFile), &quot;image\/*&quot;); \t        \t\tview.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); \t        \t\tgetContext().startActivity(view); \t\t\t\t} else if(type == 2){ \t\t\t\t\tIntent view = new Intent(android.content.Intent.ACTION_VIEW); \t        \t\tFile imageFile = new File(path); \t        \t\tview.setDataAndType(Uri.fromFile(imageFile), &quot;video\/*&quot;); \t        \t\tview.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); \t        \t\tgetContext().startActivity(view); \t\t\t\t} \t\t\t} \t\t} catch(Exception e){} \t} \t \tArrayList&lt;MediaItem&gt; mediaList(){ \t\ttry{ \t\t\tArrayList&lt;MediaItem&gt; list = new ArrayList&lt;MediaItem&gt;(); \t\t\tCursor c = getContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED}, null, null, null); \t\t\tif(c.moveToFirst()){ \t\t\t\tdo{ \t\t\t\t\tlist.add(new MediaItem(c.getString(c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)), c.getString(c.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED)), 1)); \t\t\t\t} while(c.moveToNext()); \t\t\t} \t\t\tc.close(); \t\t\tc = getContext().getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Video.Media.DATA, MediaStore.Video.Media.DATE_ADDED}, null, null, null); \t\t\tif(c.moveToFirst()){ \t\t\t\tdo{ \t\t\t\t\tlist.add(new MediaItem(c.getString(c.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)), c.getString(c.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_ADDED)), 2)); \t\t\t\t} while(c.moveToNext()); \t\t\t} \t\t\tc.close(); \t\t\tCollections.sort(list, new Comparator&lt;MediaItem&gt;(){ \t\t\t\t@Override \t\t\t\tpublic int compare(MediaItem mi1, MediaItem mi2) { \t\t\t\t\treturn mi1.date.compareToIgnoreCase(mi2.date); \t\t\t\t} \t\t\t}); \t\t\tCollections.reverse(list); \t\t\treturn list; \t\t} catch(Exception e){ \t\t\treturn new ArrayList&lt;MediaItem&gt;(); \t\t} \t} \t \tBitmap getBmp(MediaItem mi){ \t\ttry{ \t\t\tPaint p = new Paint(); \t    \t\tp.setDither(true); \t    \t\tp.setFilterBitmap(true); \t    \t\tif(mi.type == 1){ \t    \t\t\tint rot = 0; \t    \t\t\ttry{ \t\t\t\t\tExifInterface rote = new ExifInterface(mi.path); \t\t\t\t\tint r = rote.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); \t\t\t\t\tif(r == 3){ \t\t\t\t\t\trot = 180; \t\t\t\t\t} else if(r == 8){ \t\t\t\t\t\trot = 270; \t\t\t\t\t} else if(r == 6){ \t\t\t\t\t\trot = 90; \t\t\t\t\t} else { \t\t\t\t\t\trot = 0; \t\t\t\t\t} \t    \t\t\t} catch(Exception e){} \t    \t\t\tBitmapFactory.Options bfo = new BitmapFactory.Options(); \t    \t\t\tbfo.inJustDecodeBounds = true; \t    \t\t\tBitmapFactory.decodeFile(mi.path, bfo); \t    \t\t\tif(rot == 90 || rot == 270){ \t    \t\t\t\tbfo.inSampleSize = Math.min(bfo.outWidth\/140, bfo.outHeight\/120); \t    \t\t\t} else { \t    \t\t\t\tbfo.inSampleSize = Math.max(bfo.outWidth\/140, bfo.outHeight\/120); \t    \t\t\t} \t    \t\t\tbfo.inJustDecodeBounds = false; \t    \t\t\tBitmap src = BitmapFactory.decodeFile(mi.path, bfo); \t    \t\t\tif(rot != 0){ \t    \t\t\t\tMatrix m = new Matrix(); \t\t    \t\t\tm.postRotate(rot); \t\t    \t\t\tsrc = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, true); \t    \t\t\t} \t    \t\t\tfloat aspect = (float)src.getWidth()\/src.getHeight(); \t    \t\t\tint image_w = 160; \t    \t\t\tint image_h = 140; \t    \t\t\tif(aspect &gt; 1){ \t    \t\t\t\timage_h = (int)((image_w-20)\/aspect+20); \t    \t\t\t} else { \t    \t\t\t\timage_w = (int)((image_h-20)*aspect+20); \t    \t\t\t} \t    \t\t\tBitmap result = Bitmap.createBitmap(image_w, image_h, Config.ARGB_8888); \t    \t\t\tCanvas c = new Canvas(result); \t    \t\t\tframe.setBounds(0, 0, image_w, image_h); \t    \t\t\tframe.draw(c); \t    \t\t\tc.drawBitmap(src, null, new RectF(10, 10, image_w-10, image_h-10), p); \t    \t\t\treturn result; \t    \t\t} else if(mi.type == 2){ \t    \t\t\tBitmap src = ThumbnailUtils.createVideoThumbnail(mi.path, MediaStore.Video.Thumbnails.MINI_KIND); \t    \t\t\tfloat aspect = (float)src.getWidth()\/src.getHeight(); \t    \t\t\tint image_w = 160; \t    \t\t\tint image_h = (int)((image_w-20)\/aspect+20); \t    \t\t\tBitmap result = Bitmap.createBitmap(image_w, image_h, Config.ARGB_8888); \t        \t\tCanvas c = new Canvas(result); \t        \t\tframe.setBounds(0, 0, image_w, image_h); \t    \t\t\tframe.draw(c); \t    \t\t\tc.drawBitmap(src, null, new RectF(10, 10, image_w-10, image_h-10), p); \t\t    \t\tc.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.video), (image_w-64)\/2, (image_h-64)\/2, p); \t\t    \t\treturn result; \t    \t\t} \t\t} catch(Exception e){ \t\t\treturn null; \t\t} catch(OutOfMemoryError e){ \t\t\treturn null; \t\t} \t\treturn null; \t} \t \tBitmap getBmp(int res){ \t\tBitmap bmp = Bitmap.createBitmap(160, 140, Config.ARGB_8888); \t\tCanvas c = new Canvas(bmp); \t\tPaint p = new Paint(); \t\tp.setDither(true); \t\tp.setFilterBitmap(true); \t\tframe.setBounds(0, 0, 160, 140); \t\tframe.draw(c); \t\tc.drawBitmap(BitmapFactory.decodeResource(getResources(), res), 48, 38, p); \t\treturn bmp; \t} \t \tpublic class MediaItem { \t\tString path; \t\tString date; \t\tint type; \t\tpublic MediaItem(String str1, String str2, int i){ \t\t\tpath = str1; \t\t\tdate = str2; \t\t\ttype = i; \t\t} \t} \t \tpublic class Item { \t\tString path; \t\tBitmap thumbnail; \t\tint type; \t\tpublic Item(String str, Bitmap bmp, int i){ \t\t\tpath = str; \t\t\tthumbnail = bmp; \t\t\ttype = i; \t\t} \t} \t \tpublic class Transformation { \t\tMatrix matrix3d; \t\tint alpha; \t\tpublic Transformation(int pos, float percent, int imageWidth, int imageHeight){ \t\t\tfloat centerX = (float)width\/2; \t\t\tfloat centerY = (float)height\/2; \t\t\tfloat f = -pos + percent; \t\t\tcenterY -= (float)Math.sin(f*Math.PI\/2)*40; \t\t\tfloat f1 = Math.abs(f) - 0.5f; \t\t\tif(f1 &lt; 0) f1 = 0; \t\t\tfloat f2 = Math.abs(f) \/ 1.5f; \t\t\talpha = 255 - (int)(255*f1); \t\t\tfloat scale = (float) (1 - 0.4*f2); \t\t\tCamera c = new Camera(); \t\t\tmatrix3d = new Matrix(); \t\t\tc.save(); \t\t\tfloat rotate = percent*100; \t\t\tif(pos == 0) rotate *= -1; \t\t\tc.rotateX(rotate); \t\t\tc.getMatrix(matrix3d); \t\t\tmatrix3d.preTranslate(-imageWidth\/2, -imageHeight\/2); \t\t\tmatrix3d.postScale(scale, scale); \t\t\tmatrix3d.postTranslate(centerX, centerY); \t\t\tc.restore(); \t\t} \t} \t \tprivate class GestureListener extends GestureDetector.SimpleOnGestureListener { \t\t@Override \t\tpublic boolean onFling(MotionEvent me1, MotionEvent me2, float vX, float vY){ \t\t\tscroller.fling(0, getScrollY, 0, -(int)vY, 0, 0, -50, Math.max(items.length-1, 0)*140+50); \t\t\tinvalidate(); \t\t\treturn true; \t\t} \t} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439:<\/p>\n<p>  ContentObserver \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043c\u0435\u0442\u043e\u0434 onChange(boolean selfChange) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c \u0432 \u043f\u0430\u0440\u0443 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u041c\u0435\u0442\u043e\u0434 loadThumbnails() \u0433\u0440\u0443\u0437\u0438\u0442 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u044b \u0432\u0441\u0435\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 onChange ContentObserver&#8217;\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 loaderId \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f id \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0433\u043e id \u0438 id \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0415\u0441\u043b\u0438 \u0446\u0438\u0444\u0440\u044b \u043d\u0435 \u0440\u0430\u0432\u043d\u044b, \u043f\u043e\u0442\u043e\u043a \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0416\u0435\u0441\u0442\u044b \u043b\u0438\u0441\u0442\u0430\u043d\u0438\u044f \u0438 \u0431\u0440\u043e\u0441\u043a\u0430 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0445\u043e\u043b\u0441\u0442\u0430 View, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 getScrollY. Integer getSelected() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440, float getSelectedPercent() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0433\u043e\u043b \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0440\u0438\u0442\u0435\u043b\u044f. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0,5 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 45 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/4e0\/f72\/4a4\/4e0f724a4a984cd080c393d3ac9f8390.PNG\"\/><\/p>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 onTouchEvent(MotionEvent me) \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c getParent().requestDisallowInterceptTouchEvent(true) \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043b\u0438\u0441\u0442\u0430\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u043b\u0438\u0441\u0442\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u043e\u0432 \u0432 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u0435.<\/p>\n<p>  \u041d\u0443 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u043a\u043b\u0430\u0441\u0441\u0435 Transformation. \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 getSelected() \u0438 getSelectedPercent().<\/p>\n<p>  \u0415\u0449\u0451 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u044b \u0432\u0441\u0435\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0432\u0438\u0434\u0435\u043e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 Item[]. \u042d\u0442\u043e \u043f\u043b\u043e\u0445\u043e. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u043a\u0440\u0430\u0442\u043a\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u042f \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u0438\u0432\u043b\u0451\u043d, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043b\u0438\u0441\u0442\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u044f\u0442 \u043d\u0430 \u043c\u043e\u0451\u043c \u0434\u0440\u0435\u0432\u043d\u0435\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 Samsung Galaxy Gio. \u041c\u043e\u0436\u0435\u0442\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e:<\/p>\n<p>  <iframe loading=\"lazy\" width=\"560\" height=\"349\" src=\"\/\/www.youtube.com\/embed\/flBFCyNCBCs?wmode=opaque\" frameborder=\"0\" allowfullscreen><\/iframe>      \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/232477\/\"> http:\/\/habrahabr.ru\/post\/232477\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">     \t<img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/366\/85c\/c6c\/36685cc6c5ac4274896ded48eb2d95cc.png\"\/><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0445\u0430\u0431\u0440\u0430\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e. \u041c\u043e\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e <a href=\"http:\/\/habrahabr.ru\/post\/220689\/\">\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438<\/a> \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043c\u0430\u043b\u043e \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u043e \u0435\u0451 \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0445, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0432 \u043c\u0435\u043d\u044f \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u043d\u0435\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0442\u0435\u043c\u0443.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u0432 Xperia \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0430\u043d\u0434\u0440\u043e\u0438\u0434, \u044d\u0442\u043e \u043d\u0435 AppWidget, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 View, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0432\u0438\u0434\u0436\u0435\u0442. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0442\u044f\u0436\u043a\u043e\u0439 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u00ab\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c\u00bb \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u0443 Xperia Home, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u043e\u0432 \u0435\u0433\u043e \u043d\u0435\u0442. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u0432\u0438\u0434\u0436\u0435\u0442.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-232477","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/232477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=232477"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/232477\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=232477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=232477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=232477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}