zoukankan      html  css  js  c++  java
  • android 动态壁纸 3 解决 动态壁纸列表界面icon问题

    引用:http://hi.baidu.com/%CE%D2%B5%C4%B5%D8%C5%CC_007/blog/item/1fe58833bf251e55ac4b5f6d.html

    对于Android 2.1来说Live Wallpapers动态壁纸的加入为Android桌面加入了更好的动态效果。如何开发一个Android动态桌面呢? 下面eoe给大家一个详细的步骤创建属于你自己的Live Wallpaper吧。


           1. 首先我使用Eclipse创建一个标准的Android工程这里package name然后进入工程的/res/文件夹,删除layout这个文件夹,当然里面的main.xml也会被删除的,对于Live Wallpaper来说传统的布局文件是不需要的。

           2. 类似AppWidget一样,我们可以加入动态壁纸的设置界面,我们在/res/文件夹中新建一个名为xml的文件夹,新建一个utf8编码的xml文件,名为livewallpaper.xml,内容为

    Java代码:

    <?xml version="1.0" encoding="utf-8"?>

    <wallpaper xmlns:android="http://schemas.android.com/apk/res/android"

    android:thumbnail="@drawable/icon"/>                                              这里解决了动态壁纸列表界面icon图片问题

     这里我们可以看到上面的节点名为wallpaper,而设置的界面为.而在添加动态壁纸时显示图为/res/drawable/icon 这个文件,同时我们再创建一个xml文件用于LiveWallpaperSettings这个Activity的布局,我们起名为livewallpaper_settings.xml内容为

    Java代码:

    <?xml version="1.0" encoding="utf-8"?>

    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"

    android:title="@string/livewallpaper_settings"

    android:key="livewallpaper_settings">

     

    <ListPreference

    android:key="livewallpaper_testpattern"

    android:title="标题"

    android:summary="简单描述"

    android:entries="@array/livewallpaper_testpattern_names"

    android:entryValues="@array/livewallpaper_testpattern_prefix"/>

     

    <CheckBoxPreference android:key="livewallpaper_movement"

    android:summary="动态描述"

    android:title="动态标题"

    android:summaryOn="动态测试"

    android:summaryOff="静止测试"/>

    </PreferenceScreen>

     

       创建一个名为LiveWallpaper的类作为动态壁纸的主类,从WallpaperService父类继承,这里我们可以像写标准Android服务那样开发,代码为

    Java代码:


    public class LiveWallpaper extends WallpaperService

    {

     

    public static final String SHARED_PREFS_NAME = "livewallpapersettings";

     

    @Override

    public void onCreate()

    {

    super.onCreate();

    }

     

    @Override

    public void onDestroy()

    {

    super.onDestroy();

    }

     

    @Override

    public Engine onCreateEngine()

    {

    return new TestPatternEngine();

    }

     

    class TestPatternEngine extends Engine implements

    SharedPreferences.OnSharedPreferenceChangeListener

    {

     

    private final Handler mHandler = new Handler();

    private float mTouchX = -1;

    private float mTouchY = -1;

    private final Paint mPaint = new Paint();

    private final Runnable mDrawPattern = new Runnable()

    {

    public void run()

    {

    drawFrame();

    }

    };

    private boolean mVisible;

    private SharedPreferences mPreferences;

     

    private Rect mRectFrame;

     

    private Rect[] mColorRectangles;

    private int[] rectColor;

    private int mRectCount;

     

    // private

    private Rect mGradientRect;

    GradientDrawable mGradient;

    private boolean mHorizontal = false;

    private int mFrameCounter = 0;

    private boolean mMotion = true;

    private String mShape = "smpte";

     

    TestPatternEngine()

    {

    final Paint paint = mPaint;

    paint.setColor(0xffffffff);

    paint.setAntiAlias(true);

    paint.setStrokeWidth(2);

    paint.setStrokeCap(Paint.Cap.ROUND);

    paint.setStyle(Paint.Style.STROKE);

     

    mPreferences = LiveWallpaper.this.getSharedPreferences(SHARED_PREFS_NAME, 0);

    mPreferences.registerOnSharedPreferenceChangeListener(this);

    onSharedPreferenceChanged(mPreferences, null);

    }

     

    public void onSharedPreferenceChanged(SharedPreferences prefs,

    String key)

    {

    mShape = prefs.getString("livewallpaper_testpattern", "smpte");

    mMotion = prefs.getBoolean("livewallpaper_movement", true);

    readColors();

    }

     

    private void readColors()

    {

     

    int pid = getResources().getIdentifier(mShape + "colors", "array", getPackageName());

     

    rectColor = getResources().getIntArray(pid);

    mRectCount = rectColor.length;

    mColorRectangles = new Rect[mRectCount];

     

    System.out.println("mRectCount "+mRectCount);

    initFrameParams();

    }

     

    @Override

    public void onCreate(SurfaceHolder surfaceHolder)

    {

    super.onCreate(surfaceHolder);

    setTouchEventsEnabled(true);

    }

     

    @Override

    public void onDestroy()

    {

    super.onDestroy();

    mHandler.removeCallbacks(mDrawPattern);

    }

     

    @Override

    public void onVisibilityChanged(boolean visible)

    {

    mVisible = visible;

    if (visible)

    {

    drawFrame();

    }

    else

    {

    mHandler.removeCallbacks(mDrawPattern);

    }

    }

     

    @Override

    public void onSurfaceChanged(SurfaceHolder holder, int format,

    int width, int height)

    {

    super.onSurfaceChanged(holder, format, width, height);

     

    initFrameParams();

     

    drawFrame();

    }

     

    @Override

    public void onSurfaceCreated(SurfaceHolder holder)

    {

    super.onSurfaceCreated(holder);

    }

     

    @Override

    public void onSurfaceDestroyed(SurfaceHolder holder)

    {

    super.onSurfaceDestroyed(holder);

    mVisible = false;

    mHandler.removeCallbacks(mDrawPattern);

    }

     

    @Override

    public void onOffsetsChanged(float xOffset, float yOffset, float xStep,

    float yStep, int xPixels, int yPixels)

    {

     

    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)

    {

    // draw something

    drawPattern(c);

    drawTouchPoint(c);

    }

    }

    finally

    {

    if (c != null)

    holder.unlockCanvasAndPost(c);

    }

     

    mHandler.removeCallbacks(mDrawPattern);

    if (mVisible)

    {

    mHandler.postDelayed(mDrawPattern, 1000 / 25);

    }

    }

     

    void drawPattern(Canvas c)

    {

    c.save();

    c.drawColor(0xff000000);

     

    Paint paint = new Paint();

    if (mMotion)

    {

    mFrameCounter++;

    if (mHorizontal)

    {

    int right;

    int left;

    if (mFrameCounter > mRectFrame.right)

    mFrameCounter = 0;

     

    for (int i = 0; i < mRectCount; i++)

    {

    paint.setColor(rectColor[i]);

     

    right = mColorRectangles[i].right + mFrameCounter;

    left = mColorRectangles[i].left + mFrameCounter;

     

    if(right > mRectFrame.right)

    {

    c.drawRect(left - mRectFrame.right, mColorRectangles[i].top, right - mRectFrame.right, mColorRectangles[i].bottom, paint);

    }

     

    if(left < mRectFrame.right)

    {

    c.drawRect(left, mColorRectangles[i].top, right, mColorRectangles[i].bottom, paint);

    }

    }

     

    if(mShape.compareToIgnoreCase("smpte") == 0)

    {

    right =mGradientRect.right + mFrameCounter;

    left = mGradientRect.left + mFrameCounter;

    if(right > mRectFrame.right)

    {

    mGradient.setBounds(left - mRectFrame.right, mGradientRect.top, right - mRectFrame.right, mGradientRect.bottom);

    mGradient.draw(c);

    }

     

    if(left < mRectFrame.right)

    {

    mGradient.setBounds(left, mGradientRect.top, right, mGradientRect.bottom);

    mGradient.draw(c);

    }

    }

    }

    else

    {

    int top;

    int bottom;

    if (mFrameCounter > mRectFrame.bottom)

    mFrameCounter = 0;

     

     

    for (int i = 0; i < mRectCount; i++)

    {

    paint.setColor(rectColor[i]);

     

    top = mColorRectangles[i].top + mFrameCounter;

    bottom = mColorRectangles[i].bottom + mFrameCounter;

     

    if(bottom > mRectFrame.bottom)

    {

    c.drawRect(mColorRectangles[i].left, top - mRectFrame.bottom, mColorRectangles[i].right, bottom - mRectFrame.bottom, paint);

    }

     

    if(top < mRectFrame.bottom)

    {

    c.drawRect(mColorRectangles[i].left, top, mColorRectangles[i].right, bottom, paint);

    }

    }

     

    if(mShape.compareToIgnoreCase("smpte") == 0)

    {

    top = mGradientRect.top + mFrameCounter;

    bottom = mGradientRect.bottom + mFrameCounter;

     

    if(bottom > mRectFrame.bottom)

    {

    mGradient.setBounds(mGradientRect.left, top - mRectFrame.bottom, mGradientRect.right, bottom - mRectFrame.bottom);

    mGradient.draw(c);

    }

     

    if(top < mRectFrame.bottom)

    {

    mGradient.setBounds(mGradientRect.left, top, mGradientRect.right, bottom);

    mGradient.draw(c);

    }

     

    }

    }

    }

    else

    {

    for (int i = 0; i < mRectCount; i++)

    {

    paint.setColor(rectColor[i]);

    c.drawRect(mColorRectangles[i], paint);

    }

     

    if(mShape.compareToIgnoreCase("smpte") == 0)

    {

    mGradient.setBounds(mGradientRect);

    mGradient.draw(c);

    }

    }

    c.restore();

    }

     

    void drawTouchPoint(Canvas c)

    {

    if (mTouchX >= 0 && mTouchY >= 0)

    {

    c.drawCircle(mTouchX, mTouchY, 80, mPaint);

    }

    }

     

    void initFrameParams()

    {

    DisplayMetrics metrics = new DisplayMetrics();

    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    display.getMetrics(metrics);

     

    mRectFrame = new Rect(0, 0, metrics.widthPixels, metrics.heightPixels);

     

     

    int rotation = display.getOrientation();

    if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180)

    mHorizontal = false;

    else

    mHorizontal = true;

     

    System.out.println("mHorizontal "+mHorizontal);

    System.out.println("mShape "+mShape);

    if(mShape.compareToIgnoreCase("smpte") == 0)

    {

    System.out.println("mShape == smpte");

     

    CreateSmpte();

    }

    else if(mShape.compareToIgnoreCase("bars") == 0)

    {

    System.out.println("mShape == bars");

    CreateBars();

    }

    else

    {

    System.out.println("mShape == ebu");

    CreateEbu();

    }

    }

     

    private void CreateSmpte()

    {

    if(mHorizontal)

    {

    int topHeight = mRectFrame.bottom * 7 / 12;

    int bottomHeight = mRectFrame.bottom * 3 / 4;

    int wideColumnWidth = mRectFrame.right / 8;

    int narrowColumnWidth = mRectFrame.right * 3 / 28;

     

    mColorRectangles[0] = new Rect(0, 0, wideColumnWidth, topHeight);

    for (int i = 1; i < 8; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, 0, mColorRectangles[i - 1].right + narrowColumnWidth, topHeight);

    }

     

    mColorRectangles[8] = new Rect(mColorRectangles[7].right, 0, mRectFrame.right, topHeight);

     

    for (int i = 0; i < 2; i++)

    {

    int middleTop = mRectFrame.bottom * (7 + i) / 12;

    int middleBottom = mRectFrame.bottom * (8 + i) / 12;

    mColorRectangles[i + 9] = new Rect(0, middleTop, wideColumnWidth, middleBottom);

    mColorRectangles[i + 11] = new Rect(wideColumnWidth, middleTop, narrowColumnWidth + wideColumnWidth, middleBottom);

    mColorRectangles[i + 13] = new Rect(narrowColumnWidth * 7 + wideColumnWidth, middleTop, mRectFrame.right, middleBottom);

    }

     

    mColorRectangles[15] = new Rect(narrowColumnWidth + wideColumnWidth, topHeight, narrowColumnWidth * 7 + wideColumnWidth, mRectFrame.bottom * 8 / 12);

     

    mGradientRect = new Rect(mColorRectangles[15].left, mColorRectangles[15].bottom, mColorRectangles[15].right, mRectFrame.bottom * 9 / 12);

    mGradient = new GradientDrawable(Orientation.LEFT_RIGHT, new int[] { 0xff050505, 0xfffdfdfd });

    mGradient.setBounds(mGradientRect);

     

    mColorRectangles[16] = new Rect(0, bottomHeight, wideColumnWidth, mRectFrame.right);

    mColorRectangles[17] = new Rect(mColorRectangles[16].right, bottomHeight, mRectFrame.right * 9 / 56 + mColorRectangles[16].right, mRectFrame.bottom);

    mColorRectangles[18] = new Rect(mColorRectangles[17].right, bottomHeight, mRectFrame.right * 3 / 14 + mColorRectangles[17].right, mRectFrame.bottom);

    mColorRectangles[19] = new Rect(mColorRectangles[18].right, bottomHeight, mRectFrame.right * 45 / 448 + mColorRectangles[18].right, mRectFrame.bottom);

    for (int i = 20; i < 25; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, bottomHeight, mRectFrame.right * 15 / 448 + mColorRectangles[i - 1].right, mRectFrame.right);

    }

    mColorRectangles[25] = new Rect(mColorRectangles[24].right, bottomHeight, narrowColumnWidth + mColorRectangles[24].right, mRectFrame.bottom);

    mColorRectangles[26] = new Rect(mColorRectangles[25].right, bottomHeight, mRectFrame.right, mRectFrame.bottom);

    }

    else

    {

    int topHeight = mRectFrame.right * 5 / 12;

    int bottomHeight = mRectFrame.right / 4;

    int wideColumnWidth = mRectFrame.bottom / 8;

    int narrowColumnWidth = mRectFrame.bottom * 3 / 28;

     

    mColorRectangles[0] = new Rect(topHeight, 0, mRectFrame.bottom, wideColumnWidth);

     

    for (int i = 1; i < 8; i++)

    {

    mColorRectangles[i] = new Rect(topHeight, mColorRectangles[i - 1].bottom, mRectFrame.right, narrowColumnWidth + mColorRectangles[i - 1].bottom);

    }

     

    mColorRectangles[8] = new Rect(topHeight, mColorRectangles[7].bottom, mRectFrame.right, mRectFrame.bottom);

     

    for (int i = 0; i < 2; i++)

    {

    int middleLeft = mRectFrame.right * (4 - i) / 12;

    int middleRight = mRectFrame.right * (5 - i) / 12;

    mColorRectangles[i + 9] = new Rect(middleLeft, 0, middleRight, wideColumnWidth);

    mColorRectangles[i + 11] = new Rect(middleLeft, wideColumnWidth, middleRight, narrowColumnWidth + wideColumnWidth);

    mColorRectangles[i + 13] = new Rect(middleLeft, narrowColumnWidth * 7 + wideColumnWidth, middleRight, mRectFrame.bottom);

    }

    mColorRectangles[15] = new Rect(mRectFrame.right * 4 / 12, narrowColumnWidth + wideColumnWidth, mRectFrame.right * 5 / 12, narrowColumnWidth * 7 + wideColumnWidth);

     

    mGradientRect = new Rect(mRectFrame.right * 3 / 12, mColorRectangles[15].top, mColorRectangles[15].left, mColorRectangles[15].bottom);

    mGradient = new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { 0xff050505, 0xfffdfdfd });

    mGradient.setBounds(mGradientRect);

     

    mColorRectangles[16] = new Rect(0, 0, bottomHeight, wideColumnWidth);

    mColorRectangles[17] = new Rect(0, mColorRectangles[16].bottom, bottomHeight, mRectFrame.bottom * 9 / 56 + mColorRectangles[16].bottom);

    mColorRectangles[18] = new Rect(0, mColorRectangles[17].bottom, bottomHeight, mRectFrame.bottom * 3 / 14 + mColorRectangles[17].bottom);

    mColorRectangles[19] = new Rect(0, mColorRectangles[18].bottom, bottomHeight, mRectFrame.bottom * 45 / 448 + mColorRectangles[18].bottom);

    for (int i = 20; i < 25; i++)

    {

    mColorRectangles[i] = new Rect(0, mColorRectangles[i - 1].bottom, bottomHeight, mRectFrame.bottom * 15 / 448 + mColorRectangles[i - 1].bottom);

    }

    mColorRectangles[25] = new Rect(0, mColorRectangles[24].bottom, bottomHeight, narrowColumnWidth + mColorRectangles[24].bottom);

    mColorRectangles[26] = new Rect(0, mColorRectangles[25].bottom, bottomHeight, mRectFrame.bottom);

    }

    }

     

    private void CreateBars()

    {

    if(mHorizontal)

    {

    int narrowColumnWidth = mRectFrame.right / 7;

    int wideColumnWidth = mRectFrame.right * 5 / 28;

    int narrowestColumnWidth = mRectFrame.right / 21;

     

    int topColumnHeight = mRectFrame.bottom *2/3;

    int middleColumnHeight = mRectFrame.bottom /12;

     

    mColorRectangles[0] = new Rect(0, 0, narrowColumnWidth, topColumnHeight); 

    for (int i = 1; i < 7; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, 0, mColorRectangles[i - 1].right + narrowColumnWidth, topColumnHeight); 

    }

     

    mColorRectangles[7] = new Rect(0, mColorRectangles[0].bottom, narrowColumnWidth, mColorRectangles[0].bottom + middleColumnHeight); 

    for (int i = 8; i < 14; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, mColorRectangles[7].top, mColorRectangles[i - 1].right + narrowColumnWidth, mColorRectangles[7].bottom); 

    }

     

    mColorRectangles[14] = new Rect(0, mColorRectangles[7].bottom, wideColumnWidth, mRectFrame.bottom); 

    for (int i = 15; i < 18; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, mColorRectangles[14].top, mColorRectangles[i - 1].right + wideColumnWidth, mRectFrame.bottom); 

    }

     

    mColorRectangles[18] = new Rect(mColorRectangles[17].right, mColorRectangles[17].top, mColorRectangles[17].right + narrowestColumnWidth, mRectFrame.bottom); 

    for (int i = 19; i < 21; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, mColorRectangles[14].top, mColorRectangles[i - 1].right + narrowestColumnWidth, mRectFrame.bottom); 

    }

    mColorRectangles[21] = new Rect(mColorRectangles[20].right, mColorRectangles[17].top, mColorRectangles[6].right, mRectFrame.bottom); 

     

    }

    else

    {

    int narrowColumnWidth = mRectFrame.bottom / 7;

    int wideColumnWidth = mRectFrame.bottom * 5 / 28;

    int narrowestColumnWidth = mRectFrame.bottom / 21;

     

    int topColumnHeight = mRectFrame.right /3;

    int middleColumnHeight = mRectFrame.right /12;

     

    mColorRectangles[0] = new Rect(topColumnHeight, 0, mRectFrame.right, narrowColumnWidth); 

    for (int i = 1; i < 7; i++)

    {

    mColorRectangles[i] = new Rect(topColumnHeight, mColorRectangles[i - 1].bottom, mRectFrame.right, mColorRectangles[i - 1].bottom + narrowColumnWidth); 

    }

     

    mColorRectangles[7] = new Rect(mColorRectangles[0].left + middleColumnHeight, 0, mColorRectangles[0].left, narrowColumnWidth); 

    for (int i = 8; i < 14; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[7].left, mColorRectangles[i - 1].bottom, mColorRectangles[7].right, mColorRectangles[i - 1].bottom + narrowColumnWidth); 

    }

     

    mColorRectangles[14] = new Rect(0, 0, mColorRectangles[7].right, wideColumnWidth); 

    for (int i = 15; i < 18; i++)

    {

    mColorRectangles[i] = new Rect(0, mColorRectangles[i - 1].bottom, mColorRectangles[7].right, mColorRectangles[i - 1].bottom + wideColumnWidth); 

    }

     

    mColorRectangles[18] = new Rect(0, mColorRectangles[17].bottom, mColorRectangles[7].right, mColorRectangles[17].bottom + narrowestColumnWidth); 

    for (int i = 19; i < 21; i++)

    {

    mColorRectangles[i] = new Rect(0, mColorRectangles[i - 1].bottom, mColorRectangles[7].right, mColorRectangles[i - 1].bottom + narrowestColumnWidth); 

    }

    mColorRectangles[21] = new Rect(0, mColorRectangles[20].bottom, mColorRectangles[7].right, mRectFrame.bottom); 

     

    }

    }

     

    private void CreateEbu()

    {

    if(mHorizontal)

    {

    int narrowColumnWidth = mRectFrame.right / 8;

     

    mColorRectangles[0] = new Rect(0, 0, narrowColumnWidth, mRectFrame.bottom); 

    for (int i = 1; i < 8; i++)

    {

    mColorRectangles[i] = new Rect(mColorRectangles[i - 1].right, 0, mColorRectangles[i - 1].right + narrowColumnWidth, mRectFrame.bottom); 

    }

     

    }

    else

    {

    int narrowColumnWidth = mRectFrame.bottom / 8;

     

     

    mColorRectangles[0] = new Rect(0, 0, mRectFrame.right, narrowColumnWidth);

    for (int i = 1; i < 8; i++)

    {

    mColorRectangles[i] = new Rect(0, mColorRectangles[i - 1].bottom, mRectFrame.right, narrowColumnWidth + mColorRectangles[i - 1].bottom);

    }

    }

    }

    }

    }

        这里需要注意的是在androidmanifest.xml文件中加入,大家可要记住哦,可不能这个给忘了,要不上面的代码就全白费了。

    <service android:name=".LiveWallpaper" android:label="@string/app_name" android:icon="@drawable/icon">

    <intent-filter>

    <action android:name="android.service.wallpaper.WallpaperService" />

    </intent-filter>

    <meta-data android:name="android.service.wallpaper" android:resource="@xml/livewallpaper" />

    </service>

  • 相关阅读:
    js 删除字符串中所有空格
    jquery easyui datagrid 设置设置在选中的所有行中只选择第一行
    编译Linux内核时出现错误gcc: error: elf_i386: No such file or directory
    AD9打印丝印层
    s3c2410 board.c分析
    2010.03 u-boot--Makefile完全分析
    mini6410移植--uboot移植(2)
    mini6410移植--uboot移植(1)
    uboot之uboot.lds文件分析
    Linux启动过程
  • 原文地址:https://www.cnblogs.com/sode/p/2321179.html
Copyright © 2011-2022 走看看