`

两个铁球同时落地

阅读更多
  这是一篇"在比萨斜塔上模拟两个铁球同时落地",如下:




代码如下:


package com.chaoqun;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.FontMetrics;
import android.graphics.PorterDuff.Mode;
import android.os.Bundle;
import android.os.Handler;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class TwoBalls extends Activity {
    /** Called when the activity is first created. */
	protected WindowManager.LayoutParams _windowParams;
	protected WindowManager _windowManager;
	protected static Display _display;
	protected ImageView  _icon01;
	protected ImageView  _icon02;
	private Handler _messageHandler;
	private Button _go;



	
    @Override
	protected void onDestroy() {
		//清除手工添加的View
		if(_icon01 != null && _windowManager != null) {
    		_windowManager.removeViewImmediate(_icon01);
    		_icon01 = null;
    	}
		
		if(_icon02 != null && _windowManager != null) {
    		_windowManager.removeViewImmediate(_icon02);
    		_icon02 = null;
    	}
		super.onDestroy();
	}



	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _go =(Button)findViewById(R.id.options_btn);
        _display = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); //获取屏幕介质信息
        _messageHandler = new Handler();
        _go.setOnClickListener( new OnClickListener() {

			@Override
			public void onClick(View v) {
				startAnim(genBitMapforAnim("02", 40), _display.getWidth()-100 , 2, (30-40)/2);
				startAnim(genBitMapforAnim("01", 30), _display.getWidth()-150, 1, 0);
				//这里先后有时间差,忽略了,另外UI Thread在消息处理也有时间差,忽略了。
				//要精确模拟,只有自定义View,单独绘制了。
			}
        	
        });
        
    }
    
    
    
    
    protected Bitmap genBitMapforAnim(String itemCode, int size) {
    	 String text = itemCode.length() >= 5 ? itemCode.substring(0, 5) : itemCode;
    	 Bitmap result = Bitmap.createBitmap(size*2,size*2, Config.ARGB_8888);
    	 Canvas canvas =  new   Canvas(result);
    	 canvas.drawARGB(0, 0xff, 0, 0);
    	 Paint paint = new Paint();
    	 paint.setAntiAlias(true); //抗锯齿
    	 paint.setFilterBitmap(true);  //透明设置
    	 paint.setColor(Color.RED);
    	 paint.setAlpha(200);
    	 canvas.drawCircle(size/2, size/2, size/2, paint);//绘制半径为size/2的圆
    	 paint.setAlpha(255);
    	 paint.setTextSize(9);
    	 paint.setColor(Color.WHITE);
    	 float textWidth = paint.measureText(text);  //取得字体宽度
    	 FontMetrics fm = paint.getFontMetrics();  
    	 float textHeight = (float)(fm.descent +  fm.ascent) / 2; //取得字体高度
    	 
    	 canvas.drawText(text, (size-textWidth) /2.0f,(size-textHeight)/2.0f, paint); //编号
    	 
    	
    	 final Rect rect = new Rect(0, 0,size, size);
    	 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    	 canvas.drawBitmap(result, rect, rect, paint); //生成透明位图
    	 return result;
    }

    protected  void startAnim(final Bitmap bitmap, final int startXLocation, int id, final int offset) {
    	final int startY = 160;
    	
    	final ImageView imageView = new ImageView(this);
    	imageView.setImageBitmap(bitmap);
    	if(_windowParams == null)
    	_windowParams = new WindowManager.LayoutParams();
    	_windowParams.gravity = Gravity.TOP | Gravity.LEFT;  //标示要关注上下,左右位置
    	_windowParams.x =  startXLocation; //起点坐标x
    	_windowParams.y = startY + offset; //起点坐标y, 设置offset是为了保证起始位置在同一高度

    	_windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
    	_windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
    	_windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    					| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
    					| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
    					| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    	_windowParams.format = PixelFormat.TRANSLUCENT;
    	_windowParams.windowAnimations = 0;
        
    	if(_windowManager == null)
    	_windowManager = (WindowManager)TwoBalls.this.getSystemService("window"); //获取全局实例WindowManager
    	
    	
    	ImageView icon = id == 1 ? _icon01 : _icon02; 
    	if(icon != null) {
    		_windowManager.removeViewImmediate(icon);  //移除先前的View
    		icon = null;
    	}
    	else {
    		icon = imageView;
    	}
    	
    	_windowManager.addView(icon, _windowParams); //添加View到当前界面 	

        
    	  final Runnable runnable = new Runnable() {
    		 double t = 0.0d;
     		 final double g = 2.0d; 
    		  public void run() {
    			t++;
    			_windowParams.x =  startXLocation;  //由于WindowManager是单实例,所以这里要记录每个的x坐标
    			_windowParams.y  = startY + offset + (int)(0.5 * g * t * t); //匀加速运动位置计算
    			_windowManager.updateViewLayout(imageView, _windowParams); //更新坐标
    		  }
    	  };
    	
    	 new Thread() {
    		 long lastUpdate = System.currentTimeMillis();
    		 public void run() {
    			 //设置大家都经过同一高度(这里依旧考虑到球的半径不同)
    			 while (_windowParams.y + offset  < _display.getHeight() - 60  && !Thread.interrupted() && !TwoBalls.this.isFinishing()) {
    				  if(System.currentTimeMillis() - lastUpdate >= 100) { //每隔100ms动一下,移动一侦
    					  lastUpdate = System.currentTimeMillis();
    					  _messageHandler.post(runnable);
    				  }
    				  
    				 	
    			 }
    			 
    			 if(!bitmap.isRecycled()) 
    				 bitmap.recycle();    
    			 
    		 }
    	 }.start();
    	

    }  
    
    
    
    
    
    
    
    
}



已打包,有兴趣的看看.
  • 大小: 141.8 KB
分享到:
评论

相关推荐

    两个铁球同时着地说课稿.doc

    《两个铁球同时着地》这篇课文是人教版小学四年级下册第七单元的一篇重要教学内容,主要讲述了意大利科学家伽利略敢于挑战权威,通过反复试验验证科学真理的故事。该单元旨在培养学生的阅读交流能力和从故事中汲取...

    25两个铁球同时落地.ppt

    《两个铁球同时落地》是一篇描绘著名科学家伽利略挑战权威、追求真理的故事。故事主要围绕伽利略对亚里士多德“重物先落地”观点的质疑及其通过实验验证这一理论的过程展开。 首先,我们要理解的是,这篇课文旨在...

    四年级语文上册 两个铁球同时着地 1教案 长春版

    《四年级语文上册 两个铁球同时着地》这篇课文是长春版教材中的一个教案,旨在通过讲述意大利科学家伽利略对亚里士多德观点的挑战,培养学生的科学精神和批判性思维。课文的核心内容是伽利略对权威的质疑以及他通过...

    两个铁球同时着地.ppt

    两个铁球同时着地.ppt

    25两个铁球同时着地.ppt

    25两个铁球同时着地.ppt

    两个铁球同时着地教案.pdf

    《两个铁球同时着地》是一篇关于科学精神和实践检验真理的教学教案,主要讲述了17世纪意大利科学家伽利略如何挑战权威,通过实验证明亚里士多德的理论存在错误的故事。这篇教案旨在教育学生理解伽利略的科学精神,即...

    四年级语文上册 两个铁球同时着地 4教案 长春版.doc

    《四年级语文上册 两个铁球同时着地》这篇课文讲述了17世纪意大利伟大的科学家伽利略如何挑战权威,勇于探索科学真理的故事。课文旨在让学生学习伽利略的科学精神,理解并体会课文中含义深刻的句子,以及掌握段落间...

    四年级语文上册 第二十九课 两个铁球同时落地教案 鲁教版.doc

    这篇文档是针对小学四年级语文课程的一份教案,主题为“两个铁球同时落地”,源自鲁教版教材。教案详细规划了教学流程,旨在帮助学生理解并欣赏伽利略敢于挑战权威、勇于实践的科学精神,同时提升他们的阅读理解能力...

    两个铁球同时着地课堂实录.pdf

    两个铁球同时着地课堂实录.pdf

    《两个铁球同时着地》教学设计说明.docx

    《两个铁球同时着地》是一篇教学设计,旨在教授学生关于伽利略和他的著名实验。教学目标包括学习生字词、理解课文内容、掌握通过典型事例展现人物品质的写作技巧,以及学习伽利略的科学精神。课前,学生需要收集...

    四年级语文上册 两个铁球同时着地 3教案 长春版

    这篇四年级语文上册的《两个铁球同时着地》课文,主要讲述了伽利略勇于挑战权威、追求科学真理的故事。伽利略通过实验证明了亚里士多德关于物体下落速度与重量成正比的观点是错误的,他用实际行动展示了两个不同重量...

    新课标小学语文两个铁球同时着地PPT课件.pptx

    这篇PPT课件主要讲述了关于伽利略与“两个铁球同时着地”的科学故事,适合新课标小学语文教学使用。这个故事揭示了科学探索的重要性以及勇于挑战权威的科学精神。 伽利略是一位意大利物理学家和天文学家,他在17...

    《两个铁球同时着地》教案.docx

    《两个铁球同时着地》是一篇关于科学精神和探索真理的故事,主要讲述了意大利物理学家、天文学家伽利略对亚里士多德提出的“重物体比轻物体下落速度要快些”这一理论产生疑问,并进行实验验证的过程。这篇教学设计...

    四年级语文上册 两个铁球同时着地 2课件 长春版

    这篇四年级语文上册的课程主要讲解了"两个铁球同时着地"的故事,这是基于历史上著名的物理实验,由意大利科学家伽利略所进行。伽利略是科学史上的一位重要人物,他的工作对现代科学有着深远的影响。在这个课件中,...

    25_两个铁球同时着地(完美版).ppt

    《25_两个铁球同时着地(完美版).ppt》是一个关于科学教育的课件,主要讲述了伽利略在比萨斜塔所做的著名实验,旨在教育学生理解科学真理的探索方法以及勇于挑战权威的精神。这个实验是伽利略对亚里士多德观点的质疑...

    四年级语文上册 两个铁球同时着地 2教案 长春版.doc

    这篇文档是针对小学四年级语文课程的一份教案,主题为《两个铁球同时着地》,主要讲述了科学家伽利略挑战亚里士多德关于物体下落速度与重量有关的理论的故事,旨在教育孩子们不迷信权威,培养他们独立思考和求实的...

    小学语文两个铁球同时着地PPT教案.pptx

    这篇小学语文的PPT教案以"两个铁球同时着地"为主题,讲述了意大利科学家伽利略挑战传统观念的故事。故事的核心知识点围绕伽利略对亚里士多德理论的质疑和实验证明展开,旨在教育孩子们敢于质疑权威,勇于探索真理。 ...

    四年级语文上册 两个铁球同时着地 4教案 长春版

    总结,此教案以四年级语文教材中的《两个铁球同时着地》为载体,不仅教授了语言知识,还渗透了科学知识和科学方法,培养了学生的科学素养和批判性思维,同时展现了伽利略勇于探索和挑战权威的科学家形象。

    《两个铁球同时着地》第一课时课件.ppt

    《两个铁球同时着地》第一课时课件.ppt

Global site tag (gtag.js) - Google Analytics