рджрд┐рд╡рд╛рд╕реНрд╡рдкреНрди: рдПрдВрдбреНрд░реЙрдЗрдб 4.2 рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░

рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб рдпрд╛ рдЪрд╛рд░реНрдЬрд┐рдВрдЧ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЧреИрд▓рд░реА рд╕реЗ рдлреЛрдЯреЛ, рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ (рд╕рдорд╛рдЪрд╛рд░, рдлреЛрдЯреЛ, рдФрд░ рдЗрд╕реА рддрд░рд╣) рдпрд╛ рд╕рд┐рд░реНрдл рдПрдиреАрдореЗрд╢рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ рд╢реНрд░реЗрдгреА рдореЗрдВ, рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕реЗ рдХрдм рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЪрд╛рд░реНрдЬ рдХрд░рддреЗ рд╕рдордпред

рдбреЗрдбреНрд░реАрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░



рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди android.service.dreams.DreamService рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдбреНрд░реАрдо рд╕рд░реНрд╡рд┐рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдЬреАрд╡рдирдЪрдХреНрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдорд╛рди рдПрдкреАрдЖрдИ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИред рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдбреНрд░реАрдорд╕реНрд╡реЗрдп рддрд░реАрдХреЗ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ):

рдЖрдк рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреНрд░реАрдорд╕реНрд╡реЗ рддрд░реАрдХреЗ:

рдПрдХ рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ service рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> <uses-sdk android:targetSdkVersion="17" android:minSdkVersion="17" /> <application> <service android:name=".TestDaydream" android:exported="true" android:label="@string/my_daydream_name"> <intent-filter> <action android:name="android.service.dreams.DreamService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.service.dream" android:resource="@xml/dream_info" /> </service> </application> </manifest> 

<meta-data> рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ XML рд╕рдВрд╕рд╛рдзрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ Daydream рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЙрдирдХреА рдкрд╣реБрдВрдЪ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдХреЗ рдирд╛рдо рдХреЗ рдЖрдЧреЗ рд╕реЗрдЯрд┐рдВрдЧ рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 <!-- res/xml/dream_info.xml --> <?xml version="1.0" encoding="utf-8"?> <dream xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.app/.ExampleDreamSettingsActivity" /> 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╢реЗрдЦрд╝реА рд▓реЛрдЧреЛ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдмрдирд╛рддрд╛ рд╣реИред рдПрдиреАрдореЗрд╢рди рдЯрд╛рдЗрдордЕрдиреАрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЪрд┐рдХрдиреА рдПрдиреАрдореЗрд╢рди рдХрд╛ рдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИред


 public class TestDreamer extends DreamService { @Override public void onDreamingStarted() { super.onDreamingStarted(); // Our content view will take care of animating its children. final Bouncer bouncer = new Bouncer(this); bouncer.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); bouncer.setSpeed(200); // pixels/sec // Add some views that will be bounced around. // Here I'm using ImageViews but they could be any kind of // View or ViewGroup, constructed in Java or inflated from // resources. for (int i=0; i<5; i++) { final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); final ImageView image = new ImageView(this); image.setImageResource(R.drawable.android); image.setBackgroundColor(0xFF004000); bouncer.addView(image, lp); } setContentView(bouncer); } } public class Bouncer extends FrameLayout implements TimeAnimator.TimeListener { private float mMaxSpeed; private final TimeAnimator mAnimator; private int mWidth, mHeight; public Bouncer(Context context) { this(context, null); } public Bouncer(Context context, AttributeSet attrs) { this(context, attrs, 0); } public Bouncer(Context context, AttributeSet attrs, int flags) { super(context, attrs, flags); mAnimator = new TimeAnimator(); mAnimator.setTimeListener(this); } /** * Start the bouncing as soon as we're on screen. */ @Override public void onAttachedToWindow() { super.onAttachedToWindow(); mAnimator.start(); } /** * Stop animations when the view hierarchy is torn down. */ @Override public void onDetachedFromWindow() { mAnimator.cancel(); super.onDetachedFromWindow(); } /** * Whenever a view is added, place it randomly. */ @Override public void addView(View v, ViewGroup.LayoutParams lp) { super.addView(v, lp); setupView(v); } /** * Reposition all children when the container size changes. */ @Override protected void onSizeChanged (int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; for (int i=0; i<getChildCount(); i++) { setupView(getChildAt(i)); } } /** * Bouncing view setup: random placement, random velocity. */ private void setupView(View v) { final PointF p = new PointF(); final float a = (float) (Math.random()*360); px = mMaxSpeed * (float)(Math.cos(a)); py = mMaxSpeed * (float)(Math.sin(a)); v.setTag(p); v.setX((float) (Math.random() * (mWidth - v.getWidth()))); v.setY((float) (Math.random() * (mHeight - v.getHeight()))); } /** * Every TimeAnimator frame, nudge each bouncing view along. */ public void onTimeUpdate(TimeAnimator animation, long elapsed, long dt_ms) { final float dt = dt_ms / 1000f; // seconds for (int i=0; i<getChildCount(); i++) { final View view = getChildAt(i); final PointF v = (PointF) view.getTag(); // step view for velocity * time view.setX(view.getX() + vx * dt); view.setY(view.getY() + vy * dt); // handle reflections final float l = view.getX(); final float t = view.getY(); final float r = l + view.getWidth(); final float b = t + view.getHeight(); boolean flipX = false, flipY = false; if (r > mWidth) { view.setX(view.getX() - 2 * (r - mWidth)); flipX = true; } else if (l < 0) { view.setX(-l); flipX = true; } if (b > mHeight) { view.setY(view.getY() - 2 * (b - mHeight)); flipY = true; } else if (t < 0) { view.setY(-t); flipY = true; } if (flipX) vx *= -1; if (flipY) vy *= -1; } } public void setSpeed(float s) { mMaxSpeed = s; } } 

рдЖрдЗрдП рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред


рд╣рдо SDK - 17 рдХреЗ рдиреНрдпреВрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВрдЧреЗред AndroidManifest.xml рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.habrdreamer" > <!-- uses-permission android:name="android.permission.WRITE_SETTINGS" --> <uses-permission android:name="android.permission.INTERNET" /> <uses-sdk android:minSdkVersion="17" android:maxSdkVersion="17" android:targetSdkVersion="17"/> <application android:label="HabrDreamer"> <service android:name="ScreensaverHabr" android:exported="true" android:label="ScreensaverHabr"> <intent-filter> <action android:name="android.service.dreams.DreamService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <activity android:name="SetURL" android:label="Dream URL" android:theme="@android:style/Theme.Translucent.NoTitleBar"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity> <activity android:name="SetURLInteractive" android:label="Dream URL (Interactive)" android:theme="@android:style/Theme.Translucent.NoTitleBar"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity> </application> </manifest> 

рд╣рдорд╛рд░реЗ рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдХрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 package com.example.habrdreamer; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.graphics.PorterDuff; import android.net.Uri; import android.os.BatteryManager; import android.os.Handler; import android.provider.Settings; import android.service.dreams.DreamService; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.widget.TextView; public class ScreensaverHabr extends DreamService { private class LinkLauncher extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); return true; } } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); setContentView(R.layout.screensaver_habr); setFullscreen(true); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); final String url = prefs.getString("url", "http://habrahabr.ru"); final boolean interactive = prefs.getBoolean("interactive", false); Log.v("WebViewDream", String.format("loading %s in %s mode", url, interactive ? "interactive" : "noninteractive")); setInteractive(interactive); WebView webview = (WebView) findViewById(R.id.webview); webview.setWebViewClient(new LinkLauncher()); WebSettings webSettings = webview.getSettings(); webSettings.setJavaScriptEnabled(true); webview.loadUrl(url); } } 

рд╣рдореЗрдВ рджреЛ рд╡рд░реНрдЧреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдХрд╛ URL рдкрддрд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░рд╛, рд╣рдорд╛рд░реА рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдХреЛ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреНрд▓рд╕ рдХреЗ рд╕рдорд╛рди рдХрд░реЗрдВред
рддреЛ рдкрд╣рд▓реА рдХрдХреНрд╖рд╛ SetURL.java рд╣реИ:
 package com.example.habrdreamer; import android.util.Log; import android.content.SharedPreferences.Editor; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.widget.Toast; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.widget.Toast; public class SetURL extends Activity { @Override public void onCreate(Bundle stuff) { super.onCreate(stuff); final Intent intent = getIntent(); final String action = intent.getAction(); String url = intent.getStringExtra(Intent.EXTRA_TEXT); if (url == null) { finish(); } else if (Intent.ACTION_SEND.equals(action)) { set(url); finish(); } } protected void set(String url) { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); final Editor editor = prefs.edit(); editor.putString("url", url); editor.putBoolean("interactive", false); editor.commit(); Toast.makeText(this, "WebView dream URL set to: " + url, Toast.LENGTH_SHORT).show(); } } 

рдФрд░ рджреВрд╕рд░рд╛ рд╣реИ SetURLInteractive.java:
 package com.example.habrdreamer; import android.util.Log; import android.content.SharedPreferences.Editor; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.widget.Toast; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.widget.Toast; public class SetURLInteractive extends Activity { @Override public void onCreate(Bundle stuff) { super.onCreate(stuff); final Intent intent = getIntent(); final String action = intent.getAction(); String url = intent.getStringExtra(Intent.EXTRA_TEXT); if (url == null) { finish(); } else if (Intent.ACTION_SEND.equals(action)) { set(url); finish(); } } protected void set(String url) { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); final Editor editor = prefs.edit(); editor.putString("url", url); editor.putBoolean("interactive", true); editor.commit(); Toast.makeText(this, "WebView dream URL set to: " + url, Toast.LENGTH_SHORT).show(); } } 

рд╢реИрд▓реА рдлрд╝рд╛рдЗрд▓, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ WebView рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ:
 <?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" > </WebView> 

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рд╕рдВрдкрддреНрддрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ html рдлрд╝рд╛рдЗрд▓ default.html рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╕рдВрджреЗрд╢ рдФрд░ рдЫреЛрдЯреЗ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦреЗрдВрдЧреЗред
 <html> <head> <style> body { background-color: black; color: gray; font-size: 16pt; font-family: "Roboto-Light", Roboto, sans-serif; text-align: center; } #text { margin-left: auto; margin-right: auto; margin-top: 96pt; } </style> </head> <body> <div id="text">     тАЬ  (Share)тАЭ,       . </div> </body> </html> 

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдм рд╣реИ, рдЖрдк рд╕рдВрдХрд▓рди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:



рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ libGDX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред

Source: https://habr.com/ru/post/In165731/


All Articles