当前位置: 代码迷 >> Android >> 【转】android动态壁纸-线条
  详细解决方案

【转】android动态壁纸-线条

热度:154   发布时间:2016-05-01 17:20:19.0
【转】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();
?
[email protected]
??? 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;
??? ???}
??? ??}

  相关解决方案