动态壁纸蛮好玩的,也没接触过,看官方有就拿了学习下,是小马第一次接触引擎Engine,激动兴奋...效果做出来了,就放博客里,记录笔记,吼吼,跟大家交流学习, 废话不多说了,先看效果,再看源码,之后小马会把安卓动态壁纸那个水波纹也写在博客里,供大家交流学习,今天的效果如下图所示,因为手机开机后就要加载图片,所以小马就直接从开机启动完成后讲了,看图...
未开锁时立方体形式一:
![]()
开锁时立方体形式一与二:
![]()
![]()
简单的绘制效果,因为立方体都是下面这些图(由三角形拼成的)拼的,所以此处贴下这个效果图,效果制作的代码我放在形式一注释里面了,大家可以试下的,就是这个效果,临时引用的:
![]()
工程结构如下图所示:
![]()
因为形式一与形式二只是绘制点不一样,两个类都一样,防止篇幅过长(51有限制,超过80000字符就挂了,我已经超过了,这是第二边写了,所以形式二代码就不贴了),小马就直接贴形式一的代码与配置文件代码,详细的如有朋友要学习的话,下载下DEMO学习就是,小马基本的注释都加了,因为也在学习阶段,如有地方不足的,希望大家直接留言,批评指出,小马肯定感谢...
立方体形式一控制类代码:
- package xiaoma.cube1;
-
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.os.Handler;
- import android.os.SystemClock;
- import android.service.wallpaper.WallpaperService;
- import android.view.MotionEvent;
- import android.view.SurfaceHolder;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class CubeWallpaper1 extends WallpaperService {
-
-
- private final Handler mHandler = new Handler();
-
-
-
-
-
- @Override
- public void onCreate() {
- super.onCreate();
- }
-
-
-
-
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
-
-
-
-
-
- @Override
- public Engine onCreateEngine() {
- return new CubeEngine();
- }
-
-
-
-
-
-
-
-
-
- class CubeEngine extends Engine {
-
- private final Paint mPaint = new Paint();
- private float mOffset;
-
- private float mTouchX = -1;
- private float mTouchY = -1;
- private long mStartTime;
-
-
- private float mCenterX;
- private float mCenterY;
-
- private final Runnable mDrawCube = new Runnable() {
- public void run() {
- drawFrame();
- }
- };
- private boolean mVisible;
-
- CubeEngine() {
-
-
- final Paint paint = mPaint;
- paint.setColor(0xffffffff);
- paint.setAntiAlias(true);
- paint.setStrokeWidth(2);
- paint.setStrokeCap(Paint.Cap.ROUND);
- paint.setStyle(Paint.Style.STROKE);
-
- mStartTime = SystemClock.elapsedRealtime();
- }
-
-
-
-
-
-
- @Override
- public void onCreate(SurfaceHolder surfaceHolder) {
- super.onCreate(surfaceHolder);
- setTouchEventsEnabled(true);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mHandler.removeCallbacks(mDrawCube);
- }
-
-
-
-
-
- @Override
- public void onVisibilityChanged(boolean visible) {
- mVisible = visible;
-
- if (visible) {
- drawFrame();
- } else {
- mHandler.removeCallbacks(mDrawCube);
- }
- }
-
- @Override
- public void onSurfaceChanged(SurfaceHolder holder, int format,
- int width, int height) {
- super.onSurfaceChanged(holder, format, width, height);
-
- mCenterX = width / 2.0f;
- mCenterY = height / 2.0f;
- drawFrame();
- }
-
-
-
-
- @Override
- public void onSurfaceCreated(SurfaceHolder holder) {
- super.onSurfaceCreated(holder);
- }
-
- @Override
- public void onSurfaceDestroyed(SurfaceHolder holder) {
- super.onSurfaceDestroyed(holder);
- mVisible = false;
- mHandler.removeCallbacks(mDrawCube);
- }
-
-
-
-
- @Override
- public void onOffsetsChanged(float xOffset, float yOffset, float xStep,
- float yStep, int xPixels, int yPixels) {
- mOffset = xOffset;
- drawFrame();
- }
-
-
-
-
- @Override
- public void onTouchEvent(MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_MOVE) {
- mTouchX = event.getX();
- mTouchY = event.getY();
- } else {
- mTouchX = -1;
- mTouchY = -1;
- }
- super.onTouchEvent(event);
- }
-
-
-
-
- void drawFrame() {
- final SurfaceHolder holder = getSurfaceHolder();
-
- Canvas c = null;
- try {
- c = holder.lockCanvas();
- if (c != null) {
- drawCube(c);
- drawTouchPoint(c);
- }
- } finally {
- if (c != null)
- holder.unlockCanvasAndPost(c);
- }
-
-
-
- mHandler.removeCallbacks(mDrawCube);
- if (mVisible) {
- mHandler.postDelayed(mDrawCube, 1000 / 25);
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void drawCube(Canvas c) {
- c.save();
- c.translate(mCenterX, mCenterY);
- c.drawColor(0xff000000);
- drawLine(c, -400, -400, -400, 400, -400, -400);
- drawLine(c, 400, -400, -400, 400, 400, -400);
- drawLine(c, 400, 400, -400, -400, 400, -400);
- drawLine(c, -400, 400, -400, -400, -400, -400);
-
- drawLine(c, -400, -400, 400, 400, -400, 400);
- drawLine(c, 400, -400, 400, 400, 400, 400);
- drawLine(c, 400, 400, 400, -400, 400, 400);
- drawLine(c, -400, 400, 400, -400, -400, 400);
-
- drawLine(c, -400, -400, 400, -400, -400, -400);
- drawLine(c, 400, -400, 400, 400, -400, -400);
- drawLine(c, 400, 400, 400, 400, 400, -400);
- drawLine(c, -400, 400, 400, -400, 400, -400);
- c.restore();
- }
-
-
-
-
- void drawLine(Canvas c, int x1, int y1, int z1, int x2, int y2, int z2) {
-
-
-
-
-
- long now = SystemClock.elapsedRealtime();
-
- float xrot = ((float) (now - mStartTime)) / 1000;
- float yrot = (0.5f - mOffset) * 2.0f;
- float zrot = 0;
-
-
-
- float newy1 = (float) (Math.sin(xrot) * z1 + Math.cos(xrot) * y1);
- float newy2 = (float) (Math.sin(xrot) * z2 + Math.cos(xrot) * y2);
- float newz1 = (float) (Math.cos(xrot) * z1 - Math.sin(xrot) * y1);
- float newz2 = (float) (Math.cos(xrot) * z2 - Math.sin(xrot) * y2);
-
-
- float newx1 = (float) (Math.sin(yrot) * newz1 + Math.cos(yrot) * x1);
- float newx2 = (float) (Math.sin(yrot) * newz2 + Math.cos(yrot) * x2);
- newz1 = (float) (Math.cos(yrot) * newz1 - Math.sin(yrot) * x1);
- newz2 = (float) (Math.cos(yrot) * newz2 - Math.sin(yrot) * x2);
-
-
- float startX = newx1 / (4 - newz1 / 400);
- float startY = newy1 / (4 - newz1 / 400);
- float stopX = newx2 / (4 - newz2 / 400);
- float stopY = newy2 / (4 - newz2 / 400);
-
- c.drawLine(startX, startY, stopX, stopY, mPaint);
- }
-
-
-
-
- void drawTouchPoint(Canvas c) {
- if (mTouchX >= 0 && mTouchY >= 0) {
- c.drawCircle(mTouchX, mTouchY, 80, mPaint);
- }
- }
-
- }
- }
配置文件代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="xiaoma.cube1"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk android:minSdkVersion="7" />
- <!-- 小马试的,如果下面uses-feature两名句话不加的话会报
- ClassNotFoundException 异常的哦,所以大家务必加上
- -->
- <uses-feature android:name="android.software.live_wallpaper" />
- <uses-feature android:name="android.software.live_wallpaper" />
-
- <application
- android:label="@string/wallpapers"
- android:icon="@drawable/ic_launcher">
-
-
- <service
- android:label="@string/wallpaper_cube1"
- android:name=".CubeWallpaper1"
- 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/cube1" />
- </service>
-
-
- <service
- android:label="@string/wallpaper_cube2"
- android:name=".CubeWallpaper2"
- 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/cube2" />
- </service>
-
- <activity
- android:label="@string/cube2_settings"
- android:name=".CubeWallpaper2Settings"
- android:theme="@android:style/Theme.Light.WallpaperSettings"
- android:exported="true">
- </activity>
-
- </application>
-
- </manifest>
最后,看不懂小马注释的,可以自己修改下里面的点试下,看是什么效果就知道了,呵呵,小马也是第一次接触引擎这个东西,大牛多指点下,期待...因为不知道从哪开始学这些东西,就学习了下官方的,可以的话,神人多多赐教,小马一定感激的...谢谢,小DEMO源码我放附件里了,跟小马一样的菜菜可以下下来学习学习,嘿嘿,,加油加油!