`

【转】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;
       }
      }

分享到:
评论

相关推荐

    Android代码-模糊线条动态壁纸

    sunlight Project includes 3D live wallpaper for OpenGL ES 2.0 capable androind devices. Your very own sun This application is a 3D live wallpaper. It renders sun as well as other star types using ...

    android 动态壁纸源码

    在Android平台上,动态壁纸是一种能够展示生动、交互式背景效果的特色功能,它为用户提供了一种自定义手机桌面的新方式。本"android 动态壁纸源码"是一个演示项目,适用于Android 2.2(API级别8)系统,旨在帮助...

    Android2.2动态壁纸源码

    根据提供的文件信息,我们可以深入分析并提取出与“Android2.2动态壁纸源码”相关的技术知识点。以下是对这些知识点的详细解读: ### 一、动态壁纸基础概念 #### 1.1 动态壁纸定义 动态壁纸是Android平台提供的一...

    android项目之Android-logo(内含888个)

    通过分析这些Logo的设计元素,如颜色搭配、线条处理、形状构造等,可以深入理解Android设计的精髓,从而提升自己的设计水平。 此外,这个压缩包也可能包含一些矢量格式的Logo,如SVG或EPS,这样的格式便于进行大小...

    Android高级应用源码-Android Launcher 桌面分页滑动代码.zip

    在Android系统中,Launcher是用户与设备交互的入口,它是一个桌面应用,负责展示应用程序快捷方式、小部件以及桌面壁纸等。"Android高级应用源码-Android Launcher 桌面分页滑动代码.zip"是一个关于如何实现Android ...

    android TronWallpaper源码.zip

    本文将深入解析TronWallpaper的源码,帮助读者理解Android动态壁纸的实现机制,以及如何通过TronWallpaper项目学习到的相关技术。 首先,我们要明白动态壁纸在Android系统中的地位。动态壁纸是Android平台的一大...

    安卓锁屏九宫格锁屏解锁壁纸相关-Android实现自定义图案解锁效果.rar

    8. **壁纸集成**:由于资源标题提及了壁纸,这可能意味着该实现还包括了动态壁纸的集成。在Android中,你可以创建一个Live Wallpaper服务,允许用户在壁纸上直接进行图案解锁操作。 请注意,这个压缩包中的代码可能...

    android图标库

    2. 动态壁纸图标(Live Wallpaper Icons):用于动态壁纸设置的图标。 3. 快捷方式图标(Shortcut Icons):可以是应用内的某个功能或快捷操作的图标。 4. 系统图标(System Icons):包括通知、设置、状态栏等...

    Android绘图机制与处理技巧(三)——Android图像处理之图形特效处理

    例如,在制作动态壁纸或者游戏场景时,可能需要对位图进行复杂的动画效果,如波浪滚动、弹性变形等。这时,我们可以通过不断更新Matrix的变换参数,配合BitmapMesh,使位图呈现出动态的视觉效果。 为了更好地实现...

    CubeLiveWallpaper_java_

    在Java中开发动态壁纸,通常涉及到Android平台,因为Android系统广泛支持Java编程。在这个项目中,"CubeLiveWallpaperDemo"可能就是整个案例的主程序或者核心类,包含着实现立方体翻转动画的核心逻辑。 首先,我们...

    svg-android-master.zip_android开发_Java_

    SVG格式特别适用于图标、图形和动态壁纸等场景,因为它们通常需要在各种屏幕尺寸和分辨率下看起来清晰。 该压缩包中的"svg-android-master"项目很可能包含了以下关键组件: 1. SVG解析器:这是一个Java实现的解析...

    安卓Android源码——100种图片处理效果大全项目.zip

    7. **动画效果**:Android的动画系统可以实现图像的动态效果,如平移、旋转、缩放等。通过组合多个动画,可以创建复杂的交互式视觉体验。 8. **Camera API**:Android提供了Camera API来访问和控制设备的摄像头。...

    ImagePJ_android_

    在Android平台上,图片拼接是一项常见的功能,常用于图片编辑应用程序,比如制作拼图、创建故事板或设计个性化壁纸。本文将深入探讨如何在Android应用中实现图片拼接功能,以便用户可以自由组合多张图片形成一张新的...

    Android2.3开发

    通过对这些示例的学习,开发者不仅可以掌握Android 2.3的编程基础,还能深入了解各种高级特性,如传感器交互、动态壁纸、TTS、手势识别、动画等,从而提升自己的Android应用开发能力。无论是初学者还是有一定经验的...

    Android 静止时钟

    这类时钟常用于壁纸、锁屏界面或者定制化的UI设计中,它依赖于开发者手动更新时间显示。本篇文章将深入探讨如何使用Android的Canvas API来实现这样一个静止时钟。 Canvas是Android图形库中的核心类,它提供了在...

    Material Design 壁纸.zip

    壁纸可能通过动态效果或光影变化展示了这一特点,让静态的图像显得生动起来。 总的来说,"Material Design 壁纸.zip"不仅是一组美观的桌面背景,它们还是Material Design设计理念的视觉展示,包含了色彩、形状、...

    htcsense3壁纸

    2. 独特设计:HTC Sense 3的壁纸设计融合了时尚元素、艺术感以及HTC的品牌特色,包括流畅的线条、鲜艳的色彩和动态效果,为用户带来独特的视觉享受。 3. 个性化选择:压缩包中的壁纸可能包含多种风格,如自然风景、...

    android 蚯蚓线~ 亲测 可运行

    5. **修改设置**:有些情况下,关闭设备的动态壁纸或降低屏幕亮度可能有助于解决问题。 6. **禁用GPU渲染**:如果怀疑是GPU问题,可以在开发者选项中尝试禁用GPU渲染,看是否能改善状况。 在压缩包中仅有一个名为...

    Android 屏保源码.rar

    Android屏保源码是一个用于开发Android自定义锁屏应用的资源包,它包含了实现动态、交互式屏保功能所需的代码和资源。通过分析这个源码,开发者可以学习如何在Android平台上创建自己的个性化锁屏界面,增强用户体验...

Global site tag (gtag.js) - Google Analytics