2012-01-28 61 views
6

我在Android上構建了一個HTML/JS中的小遊戲。我在HTC Desire(Android 2.2)上遇到問題。當我觸摸屏幕時,所有圖像看起來像素化,並且在觸摸結束時它們變得非像素化。當屏幕被觸摸時,圖像變得像素化

下面是截圖:

enter image description here

在被觸摸屏幕時,這是正確的。有人能幫我弄清楚是什麼導致了這個問題?

注:

  • 動畫過程中沒有問題,如果屏幕沒有觸及
  • 我沒有在我的LG 540的Android這個問題2.1
  • 似乎圖像得到數量有限色當它被感動
  • 我使用PhoneGap的
+0

這是因爲顯卡,你的LG手機可能沒有3D加速,但Desire確實有一個低端的。你真的不能幫助它AFAIK – 2012-01-28 01:17:48

+0

我的更新答案下面有幫助嗎? – Matt 2012-04-06 14:55:15

回答

2

至於我可以告訴大家,說:「像素化」的行爲是OPTI滾動(在Froyo及以上版本)進行製作。如果渲染得到簡化,它使得像投影滾動動畫需要更少的處理。

如果您需要完整的瀏覽器功能,我不確定您可以提供多大幫助。

然而,既然你說過你正在做一個遊戲,我可能有一個解決方法。我希望你的遊戲不需要滾動(一個全屏),所以滾動優化是沒有必要的。

我用WebView做了一個簡單的測試。正如你所提到的那樣,點擊就可以簡化渲染,而且看起來有點不合適。然後,一旦點擊了某個東西(WebView知道沒有更多的滾動正在發生),事情就會恢復正常。

我通過用FrameLayout替換WebView來修改我的佈局。 FrameLayout包含WebView和一個不可見的按鈕(在頂部)。這個按鈕抓取所有觸摸事件。然後,我有選擇地選擇WebView應該需要的事件類型,並將它們傳遞給WebView。如果觸摸和碰觸發生在一起,兩者之間沒有移動,就沒有理由滾動,所以我沒有看到任何「像素化」行爲。

因爲這個例子最簡單,我選擇檢測「MotionEvent.ACTION_UP」事件,當它完成時,我首先發送一個消息,以便它模擬真正的點擊。你當然可以在ACTION_DOWN上觸發,但如果用戶滑動或者其他東西,你會得到不止一個,並且我想保持這裏的邏輯簡單。您可以根據自己的喜好進行自定義,並且可能有足夠的工作量,甚至可以在某些情況下啓用滾動功能。我希望下面的代碼足以傳達我認爲的工作。

WebView wv = new WebView(this); 
View dummyView = new Button(this); 
dummyView.setBackgroundColor(0x00000000); 
dummyView.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
      MotionEvent down = MotionEvent.obtain(100, 100, 
       MotionEvent.ACTION_DOWN, event.getX(), 
       event.getY(), 0); 
      wv.onTouchEvent(down); 
      wv.onTouchEvent(event); 
     } 
     return false; 
    } 
}); 
FrameLayout fl = new FrameLayout(this); 
fl.addView(wv); 
fl.addView(dummyView); 
topLayout.addView(fl); 

編輯: 如果您不希望編輯的PhoneGap源,你也許可以做到像下面這樣改變PhoneGap的佈局......這是未經測試,但看起來它應該工作:

@Override 
public void onCreate(Bundle arg0) { 
    super.onCreate(arg0); 
    super.loadUrl("file:///android_asset/www/index.html"); 
    // Get the "root" view from PhoneGap 
    LinearLayout droidGapRoot = super.root; 
    // Create a new "root" that we can use. 
    final LinearLayout newRoot = new LinearLayout(this); 
    for (int i = 0; i < droidGapRoot.getChildCount(); i++) { 
     // Move all views from phoneGap's LinearLayout to ours. 
     View moveMe = droidGapRoot.getChildAt(i); 
     droidGapRoot.removeView(moveMe); 
     newRoot.addView(moveMe); 
    } 
    // Create an invisible button to overlay all other views, and pass 
    // clicks through. 
    View dummyView = new Button(this); 
    dummyView.setBackgroundColor(0x00000000); 
    dummyView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // Only pass "UP" events to the specific view we care about, but 
      // be sure to simulate a valid "DOWN" press first, so that the 
      // click makes sense. 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
       MotionEvent down = MotionEvent.obtain(100, 100, 
         MotionEvent.ACTION_DOWN, event.getX(), 
         event.getY(), 0); 
       newRoot.onTouchEvent(down); 
       newRoot.onTouchEvent(event); 
      } 
      return false; 
     } 
    }); 
    // Layer the views properly 
    FrameLayout frameLayout = new FrameLayout(this); 
    frameLayout.addView(newRoot); 
    frameLayout.addView(dummyView); 
    // Add our new customized layout back to the PhoneGap "root" view. 
    droidGapRoot.addView(frameLayout); 
} 
+0

感謝您的文章,但正如我所說我使用Phonegap和我的應用程序是用Javascript構建的99%,我只有一個名爲App.java的Java類,你可以在這裏看到http://phonegap.com/start #android 你是否仍然認爲你的解決方案可以工作,如果我能以某種方式集成你的代碼? – adrien54 2012-02-29 11:24:58

+0

我希望上面的附加示例會有所幫助。 – Matt 2012-03-05 12:42:47

+0

我試過了,導入失蹤班後,我的應用程序正在運行,但屏幕是黑色的,我沒有任何警告或信息可以幫助我。無論如何,Thx爲你提供幫助。 – adrien54 2012-04-19 18:59:48

0

我遇到了同樣的問題。你可以嘗試的一件事是在你的應用程序的標籤清單中添加android:hardwareAccelerated =「true」。這爲我解決了這個問題,但是現在整個應用似乎都在我的設備上更像素化了,所以這可能不是最好的解決方案。

0

如果圖像與文件本身具有相同的CSS像素大小,請檢查兩次。這似乎有點相關。如果我拍攝一張大圖片並使用依賴於設備生成的CSS對其進行重新縮放,則會看到問題。否則,它不是呈現或不可見。不確定原始問題是否已在最新的Android中得到解決,但我仍然支持2.3,所以希望它有幫助。