android動態壁紙—線條 – Android移動開發技術文章_手機開發 Android移動開發教學課程

android SDK2.1中有關於動態壁紙的2個演示DEMO,本人在網上查瞭相關資料。找到瞭一個演示DEMO的源代碼,希望和大傢分享。
同時謝謝提供代碼的LZ.並且再此基礎上本人做瞭一個簡單的線條動態壁紙,後續還有動態壁紙—球的感應動作實例和大傢一起分享學習。
 
DEMO

 
ALiveWall.java
 
package com.mwongxming.LiveWall;
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 ALiveWall extends WallpaperService{
 private final Handler mHandler = new Handler();
 
 @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() {
            // Create a Paint to draw the lines for our cube
            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);
            // By default we don't get touch events, so enable them.
            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);
            // store the center of the surface, so we can draw the cube in the right spot
            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();
        }
        /*
         * Store the position of the touch event so we can use it for drawing later
         */
        @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);
        }
        /*
         * Draw one frame of the animation. This method gets called repeatedly
         * by posting a delayed Runnable. You can do any drawing you want in
         * here. This example draws a wireframe cube.
         */
        void drawFrame() {
            final SurfaceHolder holder = getSurfaceHolder();
            Canvas c = null;
            try {
                c = holder.lockCanvas();
                if (c != null) {
                    // draw something
                    drawCube(c);
                    drawTouchPoint(c);
                }
            } finally {
                if (c != null) holder.unlockCanvasAndPost(c);
            }
            // Reschedule the next redraw
            mHandler.removeCallbacks(mDrawCube);
            if (mVisible) {
                mHandler.postDelayed(mDrawCube, 1000 / 25);
            }
        }
        /*
         * Draw a wireframe cube by drawing 12 3 dimensional lines between
         * adjacent corners of the cube
         */
        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();
        }
        /*
         * Draw a 3 dimensional line on to the screen
         */
        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;
            // 3D transformations
            // rotation around X-axis
            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);
            // rotation around Y-axis
            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);
            // 3D-to-2D projection
            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);
        }
        /*
         * Draw a circle around the current touch point, if any.
         */
        void drawTouchPoint(Canvas c) {
            if (mTouchX >=0 && mTouchY >= 0) {
                c.drawCircle(mTouchX, mTouchY, 80, mPaint);
            }
        }
    }
}
AndroidManifest.xml
 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android "
 package="com.mwongxming.LiveWall" android:versionCode="1"
 android:versionName="1.0">
 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <service android:label="@string/app_name" android:name=".ALiveWall"
   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/alive_wall" />
  </service>
 </application>
 <uses-sdk android:minSdkVersion="7" />
</manifest>
 
動態壁紙—-線條

 
在原基礎上進修瞭修改,一下貼出增加的代碼:
 
private int x_point = 0;// 保存x坐標
     private int y_point = 0;// 保存y坐標
     private int height = 0;// 保存屏幕的長度
     private int width = 0;// 保存屏幕的寬度
     private int count;
     private int i = 0;
 
 
 
效果實現代碼:
mPaint.setAntiAlias(true);
            mPaint.setColor(Color.BLUE);
            mPaint.setTextSize(10);
            mPaint.setStyle(Paint.Style.FILL);
      height = c.getHeight();
      width = c.getWidth();
           
      for (i = 0; i <y_point; i = i + 10) {// 繪制前面所有行
       c.drawLine(0, i, width, i, mPaint);
       count++;
      }
      if (x_point > 0 && x_point <= width) {// 繪制當前行當前坐標之前的
       c.drawLine(0, i, x_point, i, mPaint);
      }
     
      if (x_point <= width && y_point + 10 <= height) {// 當前要繪制的
       c.drawLine(x_point, y_point, x_point + 40, y_point, mPaint);
       x_point += 40;
       if (x_point == width) {// 換行處理
        y_point = y_point + 10;
        x_point = 0;
       }
      }

發佈留言