2014-03-04 117 views
0

我正在通過onDraw()使用Timer移動Drawn Circle Shape。但它不像移動setMargin相對佈局那樣平滑移動。我該如何解決它? 這是我的Circle Shape代碼!如何移動畫布更平滑

public class Circle extends View{ 
int y =0 ; 


public Circle(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 
protected void onDraw(Canvas c){ 
    super.onDraw(c); 
    Paint p=new Paint(Paint.ANTI_ALIAS_FLAG); 
    p.setColor(Color.BLUE); 
    c.drawCircle(100,y,10,p); 

} 


} 

這是我的MainActivity代碼!

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    LinearLayout rl=new LinearLayout(this); 
    setContentView(rl); 
    rl.setBackgroundResource(R.drawable.ic_launcher); 
    final Circle c = new Circle(this); 
    rl.addView(c); 
    Timer t=new Timer(); 
    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      c.y+=4; 
      c.postInvalidate(); 
     } 
    }; 
    t.schedule(task,0,20); 
} 




@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

這就像草稿移動一樣。我不知道如何解決它。有沒有其他方法可以順利移動。有人請幫助我!

+0

您可能會嘗試降低計時器的值或將其完全移除並嘗試使用。 – Sushil

+0

是的..平滑的較低的值,但我需要這麼高的價值..謝謝 –

+0

然後,你可以減少這個值c.y + = 4;以較低的增量 – Sushil

回答

0

每20毫秒移動4個像素相當於每秒移動4個像素50次,每秒移動200個像素。

有你應該考慮在這裏幾件事情:

  • 以每秒50個更新(即每20毫秒),通常是相當高的移動設備的更新。我會誠實地減少30毫秒(或每秒33.3次更新),甚至更低一點。我記得在某個地方看到一個人在出現波動之前可以看到的最低FPS在24到26 FPS之間(如果這個數字是關閉的,請別人糾正我)。

降低每秒執行的更新次數會降低圖像隨時間傳播的距離,從而使其平滑。被警告,太低(即我提到的門檻),你的遊戲也會出現波濤洶涌。

  • 我不會推薦使用像素。如果您使用的是Android系統,則需要處理大量不同的屏幕尺寸,這意味着4像素移動在所有設備上看起來都不一樣。如果你正在開發一款遊戲,這會在設備和遊戲玩法的變化之間造成嚴重的差異。解決方案?每個人都有自己的看法,但我通常會按屏幕的百分比變化做所有事情。

話雖這麼說,你可以這樣做:

float speed = activity.getResources().getDisplayMetrics().heightPixels * 0.002f; 
// you're obviously going to have to adjust the '0.002f' to what works 
// with you and your thread's update rate per second. May also want to use 
// widthPixels depending on your orientation 

在求和:

減少你每秒正在做更新的數量,可能減少你穿越的距離與每個更新呼叫一起,並嘗試以與動態屏幕大小相關的方式完成所有操作。