Градиентная полоса живых обоев: можно ли использовать ARGB_8888 или дизеринг для исправления? - PullRequest
3 голосов
/ 15 февраля 2011

Я создаю Живые Обои и рисую на холсте при каждом вызове Runnable.run () с изменяющимся цветом, и я надеюсь поместить градиент поверх, но градиент, который я создаю, является полосатымужасно.После нескольких дней поиска в Google я нашел 2 решения: установить dither на true, установить растровое изображение canvas на ARGB_8888

я попытался сделать первое (установить dither на true) на getWallpaper ()аксессор и объект Paint, но это не помогло (я не вижу никакого сглаживания), поэтому я попытался изменить растровое изображение холста, но я не уверен, как его отобразить

// _canvasBmp = Bitmap.createBitmap(metrics.widthPixels, metrics.heightPixels, Bitmap.Config.ARGB_8888);

_shadowPaint.setStyle(Paint.Style.FILL);
_shadowPaint.setShader(new RadialGradient(metrics.widthPixels / 2,
metrics.heightPixels / 2, metrics.heightPixels / 2, 0x00000000,0x33000000, Shader.TileMode.CLAMP));
_shadowPaint.setDither(true); // this hasn't seemed to have done anything to fix the banding

// my main rendering method is this (based on the Google live wallpaper example)
void drawFrame()
{
   final SurfaceHolder holder = getSurfaceHolder();

   Canvas c = null;
   try
   {
           c = holder.lockCanvas();
           // c.setBitmap(_canvasBmp);// this was my attempt to update the bitmap to one that was ARGB_8888 but it didn't render at all

           if (c != null)
           {
                   // draw something
                   drawBackground(c);
                   drawTouchPoint(c);
                   drawShading(c);
                   drawBorder(c);

                   getWallpaper().setDither(true); // yet another attempt to get some kind of dithering going to no avail
           }
   }
   finally
   {
           if (c != null)
                   holder.unlockCanvasAndPost(c);
   }

   _handler.removeCallbacks(_drawClock); // _drawClock is the Runnable object

   if (_isVisible)
   {
           _handler.postDelayed(_drawClock, 1000 / 25);
   }
}


private void drawShading(Canvas c)
{
    c.drawRect(_screenBounds, _shadowPaint); // _screenBounds is a Rect set to the _metrics width and height
}

Спасибозаранее за ваше время

1 Ответ

4 голосов
/ 23 февраля 2011

В вашем классе PinupEngine ...

@Override
public void onCreate(SurfaceHolder surfaceHolder) {
  super.onCreate(surfaceHolder);
  surfaceHolder.setFormat(android.graphics.PixelFormat.RGBA_8888);
}

Я обнаружил, что рисунок LiveWallpaper медленнее с большим типом растрового пикселя.Я ожидаю, что он также будет использовать гораздо больше памяти (больше, чем в два раза).Если вы можете, он может заплатить, чтобы попытаться ограничить использование RGBA_8888, если это возможно.По умолчанию RGB_565, я думаю, в этом не уверен.

...