GLWallpaperService 분석 1
onCreateEngine()
방법은 이engine의 실례를 되돌려줍니다.일반적인 사용자 지정 동적 배경 그림은 다음과 같습니다.
AndroidManifest.xml
<service
android:label="@string/app_name"
android:name=".LiveWallpaper"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/livewallpaper" />
</service>
이루어지다
public class LiveWallpaper extends WallpaperService
{
@Override
public Engine onCreateEngine()
{
return new MyEngine();
}
class MyEngine extends Engine
{
Handler mHandler = new Handler();
private final Runnable drawTarget = new Runnable()
{
public void run()
{
drawFrame();
}
};
@Override
public void onCreate(SurfaceHolder surfaceHolder)
{
super.onCreate(surfaceHolder);
setTouchEventsEnabled(true);
}
@Override
public void onDestroy()
{
super.onDestroy();
//
mHandler.removeCallbacks(drawTarget);
}
@Override
public void onVisibilityChanged(boolean visible)
{
mVisible = visible;
// , drawFrame() 。
if (visible)
{
drawFrame();
}
else
{
// ,
mHandler.removeCallbacks(drawTarget);
}
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xStep,
float yStep, int xPixels, int yPixels)
{
drawFrame();
}
@Override
public void onTouchEvent(MotionEvent event)
{
//
super.onTouchEvent(event);
}
private void drawFrame()
{
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try
{
//
c = holder.lockCanvas();
if (c != null)
{
// Canvas
위 코드는 미친 안드로이드 강의의 예시 코드에서 발췌한 것으로 그 자체가 참고된 안드로이드 예시 원본의 CubeLiveWallpaper 동적 벽지(Android4.2\android\development\samples\CubeLiveWallpaper)
WallpaperService 자체가 하나의 서비스이기 때문에 UI에서 직접 그림을 그릴 수 없고surface 위의 화면을 잠그고 캔버스로 되돌아오는 것을 알 수 있습니다.그리고 캔버스에 그림이나 색상, 모양 등을 그려 그린 뒤 화면에 대한 잠금을 풀고 캔버스를 화면에 보여준다.
이런 방법은 우리가 보여주고 싶은 애니메이션을 신속하게 처리할 수 없을 것이다. 예를 들어 손가락이 미끄러지는 물결을 그리는 것이다. 이런 효과는 Canvas가 그릴 때 슬라이드처럼 끊기는 것이 아니라 더 빠른 전시가 필요하다.
이 방면의 예는 유명한 Jake Wharton(Action Bar Sherlock, Android-View Pager Indicator, butterk nife, Nine Old Androids 작가)의 초기 작품인 Breakout Wallpaper, Snake Wallpaper, Waka Wallpaper, Tron Wallpaper의 실현 효과는 모두 한 프레임 한 프레임의 애니메이션이다.
안드로이드 시스템이 자체로 가지고 있는 동적 벽지는MagicSmoke 등이다.왜 유창한 애니메이션 효과를 실현할 수 있습니까?
RenderScript 스크립트를 사용하고 render 스크립트를 사용하여 기초적인surface 화면을 렌더링하기 때문입니다.
1,RenderScriptGL mRs = newRenderScriptGL(RenderScriptWallpaper.this, sc); // WallpaperService Context RenderScript 。
2,mRs.setSurface(holder,width, height);// WallpaperService Surface 。
3,mRenderer.init(mRs,getResources(), isPreview());// rs
4,mRenderer.start(); // rs
이렇게 하면 효율적인 렌더링 스크립트를 통해 화면을 직접 그리고 동적 벽지를 유창하게 그릴 수 있다.
rs 스크립트에 익숙하지 않은 코드는 자신이 동적 벽지를 실현할 때surface를 직접 그려서 동적 벽지를 진정으로 원활하게 운행할 수 있습니까?
답은 긍정적이다.Mark F Guerra의github에는 OpenGL을 사용하는 안드로이드 동적 벽지 라이브러리인 GL Wallpaper 서비스가 구현되어 있습니다.이 라이브러리를 사용하면 OpenGL을 사용하여 빠르게 렌더링되는 동적 벽지를 더욱 신속하게 실현할 수 있습니다.OpenGL을 Android에서 사용하는 방법은 다음 자습서를 참조하십시오.
http://www.jayway.com/tag/opengl-es/
심지어 유명한 벽지 소프트웨어인 무즈도 이 라이브러리를 사용했다.관심 있는 건 참고해도 돼요.
다음에 다음과 같은 분석이 수행됩니다.
GLWallpaperService 사용
GLWallpaperService 구현 분석
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Shirates에서 상대 선택기를 사용하는 방법 - 1부 -이것은 간단하고 강력한 표현입니다(참조). 오른쪽, 아래, 왼쪽, 위 방향으로 상대적으로 위젯을 얻을 수 있습니다. 올바른 방향의 위젯 올바른 방향으로 입력 라벨을 올바른 방향으로 올바른 방향으로 이미지 :오른쪽 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.