1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,任务,3,计算器,计算器,通过前面我们学习的知识,再加上我们这节课介绍的几个控件,请大家能够独立完成一个计算器程序。,该程序只需要实现简单的加减乘除运算,不要求累计运算。,任务简介,掌握几种控件的属性,/,方法,/,监听器,独立完成计算器程序(作业提交),注:完成基本以外的功能均有加分,1,控件,1-1 ImageView,ImageView,是,View,的直接子类,用于在屏幕上显示一幅图片。,1-1,ImageView,使用,android:src,属性设置,ImageView,的图片源。,通过调
2、用调用,ImageView,类的,setImageResource(int,resId,),方法,可以动态的设定,ImageView,的图片源。,android:src,=,drawable/picturename,1-1 ImageView,使用,android:,adjustViewBounds:,自动调整图片边框以适应图片,android:layout_width,图片宽度,android:layout_height,图片高度,1-1,ImageView,图片缩放,ImageView,image=(,ImageView)findViewById(R.id.scale,);,/,从资源文件
3、获得,Bitmap,对象,/,Bitmap,pic,=,BitmapFactory.decodeResource(getResources,(),R.drawable.jadde,);,/,查询,bitmap,的高度和宽度,int,w=,pic.getWidth,();50,int,h=,pic.getHeight,();40,/,缩放图片,100 80,Bitmap scaled=,Bitmap.createScaledBitmap(pic,100,100*,h/w,false);,image.setImageBitmap(scaled,);,1-2 DatePicker/TimePicke
4、r,DatePicker,和,TimePicker,组件,分别用,于设置日期和时间。,DatePicker,用于设置年、月、日。,TimePicker,用于设置小时、分。,1-2 DatePicker/TimePicker,两个控件的属性比较常见,1-2,TimePicker,设置时间监听器,如果希望监听用户更改日期的事件,可以通过设置,OnTimeChangedListener,。,timePicker,=(,TimePicker)findViewById(R.id.,timepicker,);,timePicker.setOnTimeChangedListener(new,TimePick
5、er.OnTimeChangedListener,(),public void,onTimeChanged,(TimePicker,view,int,hourOfDay,int,minute),/,);,1-2,DatePicker,设置日期监听器,监听用户更改日期的事件,设置,OnDateChangedListener,,请注意该监听器是通过,init,函数传入的。,datePicker,=(,DatePicker)findViewById(R.id.,datepicker,);,Calendar,calendar,=,Calendar.getInstance,();,int,year=,c
6、alendar,.get(Calendar.,YEAR,);,int,month=,calendar,.get(Calendar.,MONTH,);,int,day=,calendar,.get(Calendar.,DAY_OF_MONTH,);,/,设置监听器,当用户修改日期,onDateChanged,(),被调用,datePicker.init(year,month,day,new,DatePicker.OnDateChangedListener,(),public void,onDateChanged(DatePicker,view,int,year,int,monthOfYear,i
7、nt,dayOfMonth,),);,1-3 Spinner,Spinner,是,AdapterView,的子类,,Spinner,用于显示下拉列表,供用户从列表中选择数据。,Spinner,同样是通过,Adapter,与数据绑定。,Spinner,控件,字符串数组,ArrayAdapter,1-3 Spinner,android:prompt,属性用于设置,Spinner,组件上的提示信息。,1-3 Spinner,显示,Spinner,之前,必须构建一个,Adapter,,用来连接数据,这些数据最终将显示在,Spinner,控件上。,Spinner,控件,数据,Adapter,1-3 Sp
8、inner-,创建,显示,Spinner,之前,必须构建一个,Adapter,,用来连接数据,这些数据最终将显示在,Spinner,控件上。,String CITY=,北京,上海,杭州,唐山,;,/,从数组创建,ArrayAdapter,ArrayAdapter,adapter=new,ArrayAdapter,(this,android.R.layout.,simple_spinner_item,CITY,);,/,设置下拉列表单选框的显示样式,/,adapter.setDropDownViewResource(,android.R.layout.,simple_spinner_dropdo
9、wn_item,);,/,设置,spinner,的数据源,spinner.setAdapter(adapter,);,Android,系统自带的,spinner,项的,id,1-3 Spinner-,事件响应,为,Spinner,设置监听器,OnItemSelectedListener,spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(),public,void onItemSelected(AdapterView arg0,View,arg1,int,arg2,long arg3),/arg0,:
10、spinner,控件,/arg1,:被选中的项,/arg2,:被选中项的序号,/arg3,:被选中项的,ID,public,void onNothingSelected(AdapterView arg0,),);,1-4 ProgressBar,ProgressBar,组件用来提示用户当前任务执行的进度,分为,Intermediate,模式和,Indeterminate,模式。,intermediate,模式的,ProgressBar,包含两个进度显示,分别是主进度和次进度。比如下载歌曲播放,主进度可以是当前歌曲的播放进度,可以是下载的进度。,indeterminate,模式无法计算当前执行
11、的进度,通常显示某种任务在执行。,1-4 Indetermediate,模式,有些任务无法显示百分比,此时使用,Indetermediate,模式的,ProgressBar,。运行时,在界面上显示一个循环圆圈动画。,requestWindowFeature(Window.FEATURE_INDETERMEDIATE_PROGRESS),方法可以启动此功能。,1-4 Indetermediate,模式,requestWindowFeature(Window.,FEATURE_INDETERMINATE_PROGRESS);,setContentView(R.layout.,progressbar
12、);,/,设置,bar,的可见性,setProgressBarIndeterminateVisibility(visible);,progress=(ProgressBar)findViewById(R.id.,progress);,Button button=(Button)findViewById(R.id.,toggle);,button.setOnClickListener(new View.OnClickListener(),public void onClick(View v),visible=!visible;,/,编程,bar,的可见性,setProgressBarIndete
13、rminateVisibility(visible);,);,1-4 Intermediate,模式,Intermediate,模式的,ProgressBar,包含两个进度显示,分别是主进度和次进度。可以调用下面的方法更新。,public synchronized void setProgress(int progress,),public synchronized void setSecondaryProgress(int secondaryProgress),android:progress,属性设置主进度,值,android:secondaryProgress,属性设置次进度值。,1-4
14、使用,Handler,更新,ProgressBar,只有在,UI,线程中才能更改,View,对象,而任务通常是在另外一个线程中执行,在那里才能知道任务的执行百分比。,Handler,创建时将和所在线程和线程中的消息队列绑定到一起,,Handler,对象发送的消息或者,Runnable,对象将被放到所在线程的消息队列之中。,1-4,使用,Handler,更新,ProgressBar,UI,线程,子线程,new Thread(this).start();,Run,handler.post,更新,控件或者,Activity,1-4,使用,Handler,更新,ProgressBar,/,子线程运行
15、的代码,public void run(),/,获取当前的进度,progressCurrent=progress.getProgress();,progressSecond=progress.getSecondaryProgress();,/,如果当前进度小于,100,,不停的累加并更新界面,while(progressCurrent 100),/,使用,handler,在单独线程中更新界面,handler.post(new Runnable(),public void run(),progress.setProgress(+progressCurrent);,progress.setSecondaryProgress(+progressSecond);,);,2,计算器,计算器,独立完成计算器程序(作业提交),计算器,设计界面,创建控件,获取控件变量,实现监听器,完善代码,






