java android
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,436
ボールを上に投げて落下してくるというプログラムを作りました
コード
public class Sample extends Applet implements Runnable{
Thread th;
double G = 9.8*2; //重力加速度
int time;
double mul = 0.1;
double times;
double V0y = 120.0; //初速度
double Vy;
int X = 200; //x座標
int Y = 800; //y座標
public void init(){
setSize(800, 800);
setBackground(Color.black);
}
public void start(){
th = new Thread(this);
th.start();
}
public void run(){
for(time = 0; time < 1000; time++){
times = time*mul;
repaint();
try{
Thread.sleep(50);
}
catch(InterruptedException e){
}
}
}
public void paint(Graphics g){
Vy = V0y - G*times; //V0 - at
Y = (int)(800 - (V0y*times - G*times*times/2));//V0t - at*t/2
g.setColor(Color.white);
g.fillRect(X, Y, 2, 2);
}
}
これをandroidで作ったのが下のもの
コード
public class MainActivity extends Activity implements Runnable{
private Handler h = new Handler();
private FrameLayout frameLayout;
SampleView sv;
double G = 9.8*2;
int time;
double mul = 0.1;
double times;
double V0y = 200.0;
double Vy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
frameLayout = new FrameLayout(this);
frameLayout = (FrameLayout)findViewById(R.id.FrameLayout1);
frameLayout.setBackgroundColor(Color.BLACK);
sv = new SampleView(this);
frameLayout.addView(sv);
h.postDelayed(this, 500);
}
public void run(){
for(time = 0; time < 1000; time++){
times = time*mul;
Vy = V0y - G*times;
sv.y = (int)(1400 - (V0y*times - G*times*times/2));
sv.invalidate();
try{
Thread.sleep(50);
}
catch(InterruptedException e){
}
}
}
}
public class SampleView extends View{
Paint paint = new Paint();
int x = 200; //x軸
int y = 1400; //y軸
public SampleView(Context context) {
super(context);
}
protected void onDraw(Canvas canvas){
paint.setColor(Color.WHITE);
paint.setStrokeWidth(10);
canvas.drawPoint(x, y, paint);
}
}
このようなandroidのプログラムを作ったのですが、実行するとx=200,y=1400の位置から動きませんでした。
はじめのjavaのプログラムはきちんと動くのですが、どこがだめなのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
View.invalidate
メソッドの使い方を誤っているためです。
リファレンスに
If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future.
(もしviewが可視状態であれば、onDraw
メソッドが将来のある時点で呼ばれます)
とある通り、このメソッドを呼び出しても直ちに再描画が実行されるわけではありません。
http://developer.android.com/reference/android/view/View.html#invalidate()
この辺りの説明と解決方法については、以下のページが参考になるかもしれません。
http://language-and-engineering.hatenablog.jp/entry/20120404/AndroidInvalidateRedraw
http://techbooster.org/android/application/1691/
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
onDrawの中に下記のコードを入れて結果を教えてください。
Log.d("debug","x:"+x+"/y:"+y);
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
javaのプログラムはきちんと動くのですが、どこがだめなのでしょうか?
リソースがふんだんにあるPC環境とモバイルという組み込み系の違いですね
画像やアニメーションなどは気をつけないとすぐにOutOfMemoryになりますから
ボールを上に投げて落下してくるというプログラム
代案として、そのままではありませんが
ボールが落ちるアニメーションとして
onDrawでの描画に
ScheduledExecutorServiceを使う
http://zawapro.com/?p=348
Animation Classを使う
https://akira-watson.com/android/canvas-animation.html
いっそUnityにしてしまう
ボールバウンド
https://unity3d.sakura.ne.jp/unity/bounce.html
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる