2016-01-11 1 views
0

Я хочу сделать некоторый «эффект тумана» с 3D-шумом Perlin, ось Z для числа кадров анимации.Анимация шума на Android

Я использую сетку из 16x9 LinearLayouts для этого, все они имеют одинаковый цвет фона и изменяют свою альфа-прозрачность до значений шума Perlin.

Хорошо работает на моем планшете, но с 32x18 вещами начинают немного ползать, и на моем телефоне ничего не вижу, просто некоторые артефакты - как случайное разрывание изображения.

Будет ли пользовательский вид и чертеж прямо на холсте (а затем все это увеличит все) быстрее и безопаснее?

Или проблема в создании 3D-шума настолько быстро при обновлении экрана?

ответ

1

Рисование непосредственно в холсте - это подходящий способ сделать это. Нет больше проблем с «артефактами», а также улучшена частота кадров. Это также очень легко сделать.

Вот рабочий пример MistView класса:

package com.example.yourapp; // don't forget to change this 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PorterDuff; 
import android.util.AttributeSet; 
import android.view.View; 
import android.os.Handler; 

import java.util.Random; 

public class MistView extends View { 

    SimplexNoise sN = new SimplexNoise(); // you'll need a working SimplexNoise class 
    Paint[][] paints = null; 
    float floathex[][]; 
    final static int W = 32; 
    final static int H = 18; 
    float widthf, heightf; 
    int z = 0; 
    final static int R = 128; // you can play with color here 
    final static int G = 128; 
    final static int B = 128; 
    Random rand = new Random(); 
    final int xoff = random(-100000, 100000); 
    final int yoff = random(-100000, 100000); 
    final int zoff = random(-100000, 100000); 
    Handler myHandler = new Handler(); 
    Runnable myRunnable = new Runnable() { 
     @Override 
     public void run() { 
      z++; 
      reDraw(); 
     } 
    }; 

    public MistView(Context context) { 
     super(context); 
     this.paints = new Paint[W][H]; 
     for (int w = 0; w < W; w++) 
     { 
      for (int h = 0; h < H; h++) 
      { 
       this.paints[w][h] = new Paint(); 
       this.paints[w][h].setStyle(Paint.Style.FILL); 
      } 
     } 
    } 

    public MistView(Context context, AttributeSet attributeSet) 
    { 
     super(context, attributeSet); 
     this.paints = new Paint[W][H]; 
     for (int w = 0; w < W; w++) 
     { 
      for (int h = 0; h < H; h++) 
      { 
       this.paints[w][h] = new Paint(); 
       this.paints[w][h].setStyle(Paint.Style.FILL); 
      } 
     } 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY); 
     if (widthf == 0) 
      widthf = canvas.getWidth()/(float) W; 
     if (heightf == 0) 
      heightf = canvas.getHeight()/(float) H; 
     floathex = sN.generateOctavedSimplexNoise(W, H, z, xoff, yoff, zoff, 8, 0.05f, 0.05f); 

     for (int w = 0; w < W; w++) 
     { 
      for (int h = 0; h < H; h++) 
      { 
       int a = Math.round(64* ((floathex[w][h] + 1f)/2f)); 
       if (a < 0) 
        a = 0; 
       this.paints[w][h].setColor(Color.argb(a, R, G, B)); 
       canvas.drawRect(w * widthf, h * heightf, (w + 1) * widthf, (h + 1) * heightf, this.paints[w][h]); 
      } 
     } 
     myHandler.postDelayed(myRunnable, 60); 
    } 

    protected void reDraw() { 
     this.invalidate(); 
    } 

    public int random(int min, int max) { 
     return (int) (rand.nextFloat() * (max - min + 1)) + min; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^