资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,2,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Android应用开发,1,2025/4/19 周六,2,04常用控件介绍,Widget简介,TextView,EditText,ImageView,ImageButton,ListView,ListAdapter,VideoView,SurfaceView,2025/4/19 周六,3,Widget简介,Android 开发应用除了程序应用,还有 App Widget 应用。Widget(微件)是Android1.5版所引进的特性之一。App Widget 是在桌面上的一块显示信息的东西,通过单击 App Widget 跳转到程序入口类。,而系统自带的程序,典型的App Widget 是music,这个Android 内置的音乐播放小程序。这是一个典型的App Widget+app 应用。就是一个程序既可以通过 App Widget 启动,也可以通过 App 启动。,2025/4/19 周六,Widget简介,App Widget 就是一个 AppWidgetProvider+一个 UI 界面显示(预先绑定了好多 Intent),界面上的信息可以通过程序控制而改变,单击 Widget 上的控件只能激发发送一个 Intent,或发出一个 Service 的启动通知。而 AppWidgetProvider 可以拦截这个 Intent,而进行相应的处理(比如显示新的信息)。,一、AppWidget 框架类,1.AppWidgetProvider:继承自 BroadcastRecevier,在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中onUpdate、onReceive 是最常用到的方法,它们接收更新通知。,2.AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。,3.AppWidgetManger:负责管理 AppWidget,向 AppwidgetProvider 发送通知。,4.RemoteViews:一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。,4,2025/4/19 周六,Widget简介,二、AppWidget 框架的主要类介绍,1.AppWidgetManger 类,bindAppWidgetId(int appWidgetId,ComponentName provider),通过给定的ComponentName 绑定appWidgetId,getAppWidgetIds(ComponentName provider),通过给定的ComponentName 获取AppWidgetId,getAppWidgetInfo(int appWidgetId),通过AppWidgetId 获取 AppWidget 信息,getInstalledProviders(),返回一个List的信息,getInstance(Context context),获取 AppWidgetManger 实例使用的上下文对象,updateAppWidget(int appWidgetIds,RemoteViews views),通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件,5,2025/4/19 周六,Widget简介,updateAppWidget(ComponentName provider,RemoteViews views),通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件,updateAppWidget(int appWidgetId,RemoteViews views),通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件,2.继承自 AppWidgetProvider 可实现的方法为如下:,(1)onDeleted(Context context,int appWidgetIds),(2)onDisabled(Context context),(3)onEnabled(Context context),(4)onReceive(Context context,Intent intent),Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver 所以可以重写onRecevie 方法,当然必须在后台注册Receiver,(5)onUpdate(Context context,AppWidgetManager appWidgetManager,int appWidgetIds),6,2025/4/19 周六,TextView,创建方法:,1.导入TextView 包,import android.widget.TextView;,2.在mainActivity.java 中声明一个TextView,private TextView mTextView01;,3.在main.xml 中定义一个TextView,4.利用findViewById()方法获取main.xml 中的TextView,mTextView01=(TextView)findViewById(R.id.TextView01);,5.设置TextView 标签内容,mTextView01.setText(“HelloWorld”);,7,2025/4/19 周六,EditText,EditText 相当于很多程序中的TextField,是一个可以让用户输入文本的组件,是用户和程序之间用于传输数据的纽带,通过它用户可以把数据传送给Android程序。,示例代码:,8,2025/4/19 周六,EditText,EditText继承自TextView,所以拥有TextView的所有属性。另外,EditText还有属于自己的属性。android:hint是EditText的默认提示文字,一般用于提示用户输入。android:textColorHint是提示文字的颜色,如果不设置,就为默认提示颜色。android:maxLength表示最大输入长度。android:password=“true”就可以实现这一密码输入功能。,android:numeric=“signed”表示输入数字的类型,可以是Integer,一共有三种分别为integer(正整数)、signed(带符号整数)和decimal(浮点数)。,android:phoneNumber=“true”用于专门输入电话号码的文本框也是大有用途,有了他我们对是否是电话号码的校验就容易的多了(因为字符是正确的,只要校验格式)。通过设置android:phoneNumber=“true”就可以把EditText变成只接受电话号码输入的文本框,连软键盘都已经变成拨号专用软键盘了,所以不用再担心输入其他字符了。,9,2025/4/19 周六,ImageView,ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上。在Android中插入图片:,1、导入图片到资源,将图片拖拽到项目resdrawable开头的3个文件夹下,他们分别代表了高、中、低分辨度的图片。Android读取图片时自动优化,选用合适的一个图片显示,比如高分辨率可以存放128*128的图片,低分辨率可以存放32*32的图片。,10,2025/4/19 周六,ImageView,2、在XML布局文件中建立ImageView:,3、运行程序,查看效果:,11,2025/4/19 周六,ImageView,ImageView可以设置图片的可见性,设置颜色、设置图片指定大小。,1、public voidsetVisibility(int visibility),visibility One of VISIBLE,INVISIBLE,or GONE,但是在调用此方法的时候,image.setVisibility(visibility),其中visibility是int型的参数。对应上面:VISIBLE=0 x00000000;INVISIBLE=0 x00000004;GONE=0 x00000008。,即:,image.setVisibility(0 x00000000)表示显示;,image.setVisibility(0 x00000004)表示隐藏;,image.setVisibility(0 x00000008)表示view不存在。,12,2025/4/19 周六,ImageView,2、设置颜色的不同方法,color.rgb(255,255,255);,color.RED;,color.parseColor(colorString);其中colorString可以是:#RRGGBB#AARRGGBB red,blue,green,black,white,gray,cyan,magenta,yellow,lightgray,darkgray 等,3、设置图片指定大小,protected Bitmap scaleImg(Bitmap bm,int newWidth,int newHeight),/图片源,/Bitmap bm=BitmapFactory.decodeStream(getResources(),/.openRawResource(id);,/获得图片的宽高,int width=bm.getWidth();,int height=bm.getHeight();,13,2025/4/19 周六,ImageView,/设置想要的大小,int newWidth1=newWidth;,int newHeight1=newHeight;,/计算缩放比例,float scaleWidth=(float)newWidth1)/width;,float scaleHeight=(float)newHeight1)/height;,/取得想要缩放的matrix参数,Matrix matrix=new Matrix();,matrix.postScale(scaleWidth,scaleHeight);,/得到新的图片,Bitmap newbm=Bitmap.createBitmap(bm,0,0,width,height,matrix,true);,return newbm;,14,2025/4/19 周六,ImageView,调用:,获得1818的图片,Bitmap bm=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.icon);,Bitmap newBm=scaleImg(bmImg,18,18);,imageView.setImageBitmap(newBm);,android:scaleType:,android:scaleType是控制图片如何resized/moved来匹对ImageView的size。,15,2025/4/19 周六,ImageView,ImageView.ScaleType/android:scaleType值的意义区别:,CENTER/center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示,CENTER_CROP/centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽),CENTER_INSIDE/centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽,FIT_CENTER/fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示,FIT_END/fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置,FIT_START/fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置,FIT_XY/fitXY 把图片 不按比例 扩大/缩小到View的大小显示,MATRIX/matrix 用矩阵来绘制,动态缩小放大图片来显示。,16,2025/4/19 周六,ImageButton,下面主要讲的就是imagebutton按钮,切记给按钮加图片的话,图片不要太大,最好是PNG格式的。要不效果就不是那么好了。,示例代码:,17,2025/4/19 周六,ImageButton,ImageButton在Android的运用非常灵活,既可以在.java中实现,也可以在.xml中实现,但相比较而言在.xml中实现更有利于代码的改动,现分别讲述以上两种实现方式:,1.一种是在代码里,自己的图片,m_ImageButton.setImageDrawable(getResources().getDrawable(R.drawable.my_button);,系统自带的图片,m_ImageButton.setImageDrawable(getResources().getDrawable(Android.R.drawable.sym_call_incoming);,2.一种是在XML文件里,自己的图片,Android:src=././drawable/ic_media_play,系统自带的图片,Android:src=android:drawable/sym_call_incoming,18,2025/4/19 周六,ImageButton,3.指定按钮的背景图,有state_pressed和state_focused,分别代表按下去和焦点停留(用方向键等控制)时的状态,默认都是false。下面可以实现按下去时的背景图。,在main.xml里添加,,Android:background=drawable/button_add_x一行。,在res/drawable下添加一个button_add_x.xml的文件,19,2025/4/19 周六,ListView,在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。,示例代码:,20,2025/4/19 周六,ListView,列表的显示需要三个元素:,1ListVeiw 用来展示列表的View。,2适配器:用来把数据映射到ListView上的中介。,3数据:具体的将被映射的字符串,图片,或者基本组件。,21,2025/4/19 周六,ListAdapter,根据列表的适配器类型,列表分为三种:ArrayAdapter、SimpleAdapter和SimpleCursorAdapter。,1.ArrayAdapter,其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便的把数据库的内容以列表的形式展示出来。,ArrayAdapter(Context context,int textViewResourceId,List objects)需要一个连接ListView视图对象和数组数据的适配器来完成两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局。,用setAdapter()完成适配的最后工作。,22,2025/4/19 周六,ListAdapter,2.SimpleCursorAdapter,sdk的解释是这样的:An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file.You can specify which columns you want,which views you want to display the columns,and the XML file that defines the appearance of these views。简单的说就是方便把从游标得到的数据进行列表显示,并可以把指定的列映射到对应的TextView中。,23,2025/4/19 周六,ListAdapter,下面的程序是从电话簿中把联系人显示到列表中。先在通讯录中添加一个联系人作为数据库的数据。然后获得一个指向数据库的Cursor并且定义一个布局文件(当然也可以使用系统自带的)。,public class MyListView2 extends Activity,private ListView listView;,/private List data=new ArrayList();,Override,public void onCreate(Bundle savedInstanceState),super.onCreate(savedInstanceState);,listView=new ListView(this);,Cursor cursor=getContentResolver().query(People.CONTENT_URI,null,null,null,null);,startManagingCursor(cursor);,ListAdapter listAdapter=new SimpleCursorAdapter(this,android.R.layout.simple_expandable_list_item_1,cursor,new StringPeople.NAME,new intandroid.R.id.text1);,listView.setAdapter(listAdapter);,setContentView(listView);,24,2025/4/19 周六,ListAdapter,Cursor cursor=getContentResolver().query(People.CONTENT_URI,null,null,null,null);先获得一个指向系统通讯录数据库的Cursor对象获得数据来源。,startManagingCursor(cursor);我们将获得的Cursor对象交由Activity管理,这样Cursor的生命周期和Activity便能够自动同步,省去自己手动管理Cursor。,SimpleCursorAdapter 构造函数前面3个参数和ArrayAdapter是一样的,最后两个参数:一个包含数据库的列的String型数组,一个包含布局文件中对应组件id的int型数组。其作用是自动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上。上面的代码,将NAME列的数据一次映射到布局文件的id为text1的组件上。,注意:需要在AndroidManifest.xml中如权限:,运行后效果如下图:,25,2025/4/19 周六,ListAdapter,26,2025/4/19 周六,ListAdapter,3.SimpleAdapter,simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。,下面的程序是实现一个带有图片的类表。,首先需要定义好一个用来显示每一个列内容的xml,vlist.xml,27,2025/4/19 周六,ListAdapter,28,2025/4/19 周六,ListAdapter,下面是实现代码:,public class MyListView3 extends ListActivity,/private List data=new ArrayList();,Override,public void onCreate(Bundle savedInstanceState),super.onCreate(savedInstanceState);,SimpleAdapter adapter=new SimpleAdapter(this,getData(),R.layout.vlist,new Stringtitle,info,img,new intR.id.title,R.id.info,R.id.img);,setListAdapter(adapter);,private List getData(),List list=new ArrayList();,Map map=new HashMap();,map.put(title,G1);,map.put(info,google 1);,map.put(img,R.drawable.i1);,list.add(map);,29,2025/4/19 周六,ListAdapter,map=new HashMap();,map.put(title,G2);,map.put(info,google 2);,map.put(img,R.drawable.i2);,list.add(map);,map=new HashMap();,map.put(title,G3);,map.put(info,google 3);,map.put(img,R.drawable.i3);,list.add(map);,return list;,使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。,30,2025/4/19 周六,运行效果如下图:,ListAdapter,31,2025/4/19 周六,VideoView,在Android上可以通过VideoView和SurfaceView实现视频播放功能,可以播放本地视频也可以播放网络视频。,通过VideoView播放SDCard上的视频示例:,先看看实现的效果:,32,2025/4/19 周六,1.VideoActivity.java,程序入口类。,package net.androidla.video;,import java.io.File;,import android.app.Activity;,import android.os.Bundle;,import android.os.Environment;,import android.widget.MediaController;,import android.widget.VideoView;,public class VideoActivity extends Activity,Override,public void onCreate(Bundle savedInstanceState),super.onCreate(savedInstanceState);,setContentView(R.layout.main);,final VideoView vv=(VideoView)findViewById(R.id.vv);,vv.setVideoPath(Environment.getExternalStorageDirectory()+File.separator+1.3gp);,vv.setMediaController(new MediaController(VideoActivity.this);,vv.requestFocus();,vv.start();,VideoView,33,2025/4/19 周六,2./res/layout/main.xml VideoView,控件的使用。,VideoView,34,2025/4/19 周六,SurfaceView,通过SurfaceView播放SDCard上的视频和网络视频。,播放效果:,35,2025/4/19 周六,1.SurfaceViewActivity.java,程序入口类,通过,setDataSource(),方法可以播放本地视频和网络视频,参数是视频的地址。,package net.androidla.surfaceview;,import android.app.Activity;,import android.media.AudioManager;,import android.media.MediaPlayer;,import android.media.MediaPlayer.OnBufferingUpdateListener;,import android.media.MediaPlayer.OnCompletionListener;,import android.media.MediaPlayer.OnPreparedListener;,import.Uri;,import android.os.Bundle;,import android.view.SurfaceHolder;,import android.view.SurfaceView;,import android.widget.Toast;,public class SurfaceViewActivity extends Activity implements OnBufferingUpdateListener,OnCompletionListener,OnPreparedListener,SurfaceHolder.Callback,private int width=0;,private int height=0;,private MediaPlayer mp=null;,private SurfaceView surfaceView=null;,private SurfaceHolder holder=null;,SurfaceView,36,2025/4/19 周六,SurfaceView,Override,public void onCreate(Bundle savedInstanceState),super.onCreate(savedInstanceState);,setContentView(R.layout.main);,surfaceView=(SurfaceView)findViewById(R.id.surfaceView);,holder=surfaceView.getHolder();,holder.addCallback(this);,holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);,public void playVideo(),try,mp=new MediaPlayer();,/mp.setDataSource(Environment.getExternalStorageDirectory()+File.separator+1.3gp);,mp.setDataSource(this,Uri.parse(192.168.1.104:9080/temp/1.3gp);,mp.setAudioStreamType(AudioManager.STREAM_MUSIC);,mp.setDisplay(holder);,mp.prepare();,System.out.println(duration=+mp.getDuration();,mp.setOnBufferingUpdateListener(this);,mp.setOnCompletionListener(this);,mp.setOnPreparedListener(this);,catch(Exception e),e.printStackTrace();,37,2025/4/19 周六,SurfaceView,Override,public void surfaceChanged(SurfaceHolder holder,int format,int width,int height),System.out.println(surfaceChanged.);,playVideo();,Override,public void surfaceCreated(SurfaceHolder holder),System.out.println(surfaceCreated.);,playVideo();,Override,public void surfaceDestroyed(SurfaceHolder holder),Toast.makeText(SurfaceViewActivity.this,停止播放,Toast.LENGTH_SHORT).show();,System.out.println(surfaceDestroyed.);,38,2025/4/19 周六,SurfaceView,Override,protected void onPause(),super.onPause();,if(mp!=null),if(mp.isPlaying(),mp.stop();,mp.reset();,mp.release();,mp=null;,Override,public void onPrepared(MediaPlayer arg0),width=mp.getVideoWidth();,height=mp.getVideoHeight();,if(width!=0&height!=0),holder.setFixedSize(width,height);,mp.start();,System.out.println(duration=+mp.getDuration();,39,2025/4/19 周六,SurfaceView,Override,public void onCompletion(MediaPlayer mp),Toast.makeText(SurfaceViewActivity.this,开始播放,Toast.LENGTH_SHORT).show();,System.out.println(onCompletion.);,Override,public void onBufferingUpdate(MediaPlayer mp,int percent),System.out.println(onBufferingUpdate.+percent);,40,2025/4/19 周六,2./res/layout/main.xml SurfaceView,控件的使用。,SurfaceView,41,2025/4/19 周六,
展开阅读全文