2012-02-06 19 views
22

मैं एंड्रॉइड मंच पर नया हूं। मैं लाइव वॉलपेपर एप्लिकेशन विकसित करना चाहता हूं। जब मुझे खोज इंजन में इस बारे में खोजा गया, तो उनमें से कई ने अपने कोड (SurfaceView और Canvas का उपयोग करके) के रूप में एक लाइव वॉलपेपर बनाया, मुझे इसमें बहुत जानकारी नहीं है। यहां मेरा संदेह है, कोई भी लाइव वॉलपेपर के रूप में .gif छवियों को सेट करने के लिए संभव हैक्या एनिमेटेड gif फ़ाइल को एंड्रॉइड में लाइव वॉलपेपर के रूप में सेट करना संभव है?

+0

[इस जवाब देने के लिए] का संदर्भ लें (http://stackoverflow.com/a/7772170/967142) – Jens

+0

@Jens: अपने पुनरावृत्ति के लिए धन्यवाद, आप किसी भी नमूना कोड कैसे करना है ऐसा करें, – Aerrow

+0

अच्छा, यह आपको दिखाता है [कैसे] (http: //droid-blog.n एटी/2011/10/14/ट्यूटोरियल-कैसे-उपयोग-एनिमेटेड-gifs-in-android-part-1 /) – Jens

उत्तर

45

यह एनिमेटेड gif प्रदर्शित करने के लिए हैक की गई मूल वॉलपेपर सेवा (जैसा कि लाइव वॉलपेपर ट्यूटोरियल में आपूर्ति की गई है) है।

पहला - एक परियोजना बनाएं & लाइव वॉलपेपर के रूप में अपना मैनिफेस्ट सेट करें।
फिर - एक gif कि gif सहेजें res/raw/nyan.gif में अपनी परियोजना में डाउनलोड, यह एक
      nyan nyan

की तरह।
इस उदाहरण में दिखाए गए एक लाइव वॉलपेपर सेवा बनाएं।

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(); 
     } 
    } 
} 

यह मूलतः न्यान-न्यान बिल्ली स्क्रीन के अनुरूप बनाने और इसे सदा चेतन करने के लिए पैमाने पर होगा।

एक लाइव वॉलपेपर प्रकट प्रकार के- की तरह इस (इस उदाहरण एक विन्यास गतिविधि शामिल नहीं है) दिखता है:

<?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> 

AndroidManifest.xml res/xml में एक फ़ाइल के लिए एक संदर्भ है, इस मामले में नामित "nyan.xml":

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

इसे निष्पादित नहीं किया गया है, लेकिन मेरे कंसोल शो में बिल्ली = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = test.anim/.NyanNyanService} शून्य से नहीं है (pid = 7019, uid = 2000) की आवश्यकता है android.permission.BIND_WALLPAPER – Aerrow

+0

मुझे लगता है कि मैं मैनिफेस्ट फ़ाइल में गलती करता हूं, क्या आप कृपया मेनिफेस्ट फ़ाइल पोस्ट कर सकते हैं। – Aerrow

+0

एचएम। हां, आप किसी भी चीज़ से लाइव वॉलपेपर शुरू नहीं कर सकते हैं जिसमें BIND_WALLPAPER अनुमति नहीं है (जो सिस्टम अनुप्रयोगों के लिए आरक्षित है) - यानी अपने वॉलपेपर का परीक्षण करने के लिए आप इसे अपने होम स्क्रीन में लाइव वॉलपेपर पिकर में चुनते हैं। – Jens

संबंधित मुद्दे