2012-02-06 33 views
22

Tôi mới sử dụng nền tảng Android. Tôi muốn phát triển một hình nền sống trực tiếp. Khi tôi được tìm kiếm về điều này trong Công cụ tìm kiếm, nhiều người trong số họ đã tạo hình nền động làm mã của họ (sử dụng SurfaceViewCanvas), tôi không biết nhiều về điều này. Đây là sự nghi ngờ của tôi, bất kỳ nào cũng có thể đặt hình ảnh .gif làm hình nền động.Có thể đặt một tệp gif động làm hình nền động trong Android không?

+0

tham khảo [câu trả lời này] (http://stackoverflow.com/a/7772170/967142) – Jens

+0

@Jens: cảm ơn cho phát lại của bạn, nếu bạn có bất kỳ mẫu mã làm thế nào để làm điều này, – Aerrow

+0

Vâng, điều này cho bạn thấy [cách] (http: //droid-blog.n et/2011/10/14/tutorial-how-to-use-hoạt hình-gifs-in-android-part-1 /) – Jens

Trả lời

45

Đây là dịch vụ hình nền cơ bản (như được cung cấp trong Hướng dẫn hình nền động) bị tấn công để hiển thị hình động gif.

Đầu tiên - tạo dự án & thiết lập tệp kê khai dưới dạng hình nền động.
Sau đó - tải về một gif, như thế này một
      nyan nyan

Lưu gif rằng trong res/raw/nyan.gif trong dự án của bạn.
Tạo dịch vụ hình nền động, như được minh họa trong ví dụ này.

public class NyanNyanService extends WallpaperService { 
    static final String TAG = "NYAN"; 
    static final Handler mNyanHandler = new Handler(); 

    /** 
    * @see android.service.wallpaper.WallpaperService#onCreate() 
    */ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    /** 
    * @see android.service.wallpaper.WallpaperService#onCreateEngine() 
    */ 
    @Override 
    public Engine onCreateEngine() { 
     try { 
      return new NyanEngine(); 
     } catch (IOException e) { 
      Log.w(TAG, "Error creating NyanEngine", e); 
      stopSelf(); 
      return null; 
     } 
    } 

    class NyanEngine extends Engine { 
     private final Movie mNyan; 
     private final int mNyanDuration; 
     private final Runnable mNyanNyan; 
     float mScaleX; 
     float mScaleY; 
     int mWhen; 
     long mStart; 

     NyanEngine() throws IOException { 
      InputStream is = getResources().openRawResource(R.raw.nyan); 
      if (is != null) { 
       try { 
        mNyan = Movie.decodeStream(is); 
        mNyanDuration = mNyan.duration(); 
       } finally { 
        is.close(); 
       } 
      } else { 
       throw new IOException("Unable to open R.raw.nyan"); 
      } 

      mWhen = -1; 
      mNyanNyan = new Runnable() { 
       public void run() { 
        nyan(); 
       } 
      }; 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      mNyanHandler.removeCallbacks(mNyanNyan); 
     } 

     @Override 
     public void onVisibilityChanged(boolean visible) { 
      super.onVisibilityChanged(visible); 
      if (visible) { 
       nyan(); 
      } else { 
       mNyanHandler.removeCallbacks(mNyanNyan); 
      } 
     } 

     @Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
      super.onSurfaceChanged(holder, format, width, height); 
      mScaleX = width/(1f * mNyan.width()); 
      mScaleY = height/(1f * mNyan.height()); 
      nyan(); 
     } 

     @Override 
     public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, 
       float yOffsetStep, int xPixelOffset, int yPixelOffset) { 
      super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset); 
      nyan(); 
     } 

     void nyan() { 
      tick(); 
      SurfaceHolder surfaceHolder = getSurfaceHolder(); 
      Canvas canvas = null; 
      try { 
       canvas = surfaceHolder.lockCanvas(); 
       if (canvas != null) { 
        nyanNyan(canvas); 
       } 
      } finally { 
       if (canvas != null) { 
        surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
      mNyanHandler.removeCallbacks(mNyanNyan); 
      if (isVisible()) { 
       mNyanHandler.postDelayed(mNyanNyan, 1000L/25L); 
      } 
     } 

     void tick() { 
      if (mWhen == -1L) { 
       mWhen = 0; 
       mStart = SystemClock.uptimeMillis(); 
      } else { 
       long mDiff = SystemClock.uptimeMillis() - mStart; 
       mWhen = (int) (mDiff % mNyanDuration); 
      } 
     } 

     void nyanNyan(Canvas canvas) { 
      canvas.save(); 
      canvas.scale(mScaleX, mScaleY); 
      mNyan.setTime(mWhen); 
      mNyan.draw(canvas, 0, 0); 
      canvas.restore(); 
     } 
    } 
} 

này về cơ bản sẽ mở rộng con mèo nyan nyan-để phù hợp với màn hình và animate nó vĩnh viễn.

Một hình nền sống manifest trông loại-of-như thế này (ví dụ này không chứa một hoạt động cấu hình):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="your.nyan.nyan.package" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="10" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/application_nyan" > 
     <service 
      android:label="@string/wallpaper_nyan" 
      android:name=".NyanNyanService" 
      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/nyan" /> 
     </service> 
    </application> 
</manifest> 

Các AndroidManifest.xml có một tham chiếu đến một tập tin trong res/xml, trong trường hợp này được đặt tên "nyan.xml":

<?xml version="1.0" encoding="utf-8"?> 
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" /> 
+0

nó thực hiện nhưng không có đầu ra trên màn hình, trong giao diện điều khiển của tôi cho thấy, cat = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = test.anim/.NyanNyanService} từ null (pid = 7019, uid = 2000) yêu cầu android.permission.BIND_WALLPAPER – Aerrow

+0

Tôi nghĩ rằng tôi phạm sai lầm trong tệp kê khai, bạn có thể vui lòng đăng tệp kê khai hay không. – Aerrow

+0

hm. có, bạn không thể bắt đầu một hình nền động từ bất kỳ thứ gì không giữ quyền BIND_WALLPAPER (được dành riêng cho các ứng dụng hệ thống) - tức là để kiểm tra hình nền của bạn, bạn chọn nó trong bộ chọn hình nền động trong màn hình chủ của bạn. – Jens

Các vấn đề liên quan