Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 858|回复: 0

开发交流:Android 深入解析用户界面

[复制链接]

该用户从未签到

发表于 2011-10-24 10:51:53 | 显示全部楼层 |阅读模式
   ImageView
       android..widget..ImageView图片控件,继承自android..view..View,在android..widget包中..
  最简单的使用方法..src设置图片路径,可引用drawable的图片..
  动态声明ImageView,设置src..

       ImageButton

       android..widget..ImageButton图片控件,继承自android..widget..ImageView,在android..widget包中..
  最简单的使用方法..src设置图片路径,可引用drawable的图片..
  动态声明ImageView,设置src..

       ImageSwitcher和Gallery

       android..widget.. ImageSwitcher图片控件,继承自android..widget..ViewSwitcher(ViewGroup)..在android..widget包中..
  ImageSwithcer是用来图片显示那块区域的控件,使用方法setInAnimation(Animation),setOutAnimation(Animation)设置动画..
  Gallery是来控制底下那个图标索引列表索引用的..ImageAdapter继承自BaseAdapter,设置Gallery的适配器..
  在layout添加ImageSwitcher和Gallery..定义 Activity,implements接口OnItemSelectedListener, ViewFactory..onCreate的时候定义要显示图片路径列表,设置Gallery的Adapter..onItemSelected事件触发 时,设置对应的图片..

java代码: <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent">



<ImageSwitcher android:id="@+id/switcher"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_alignParentTop="true"

android:layout_alignParentLeft="true" />



<Gallery android:id="@+id/gallery"

android:background="#55000000"

android:layout_width="fill_parent"

android:layout_height="60dp"

android:layout_alignParentBottom="true"

android:layout_alignParentLeft="true"

android:gravity="center_vertical"

android:spacing="16dp" />



</RelativeLayout>
复制代码java代码: public class SwitcherActivity extends Activity implements OnItemSelectedListener, ViewFactory {



private ImageSwitcher imageSwitcher;

private Gallery gallery;



private ArrayList<String> imageAssetPathList = new ArrayList<String>();



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

super.setContentView(R.layout.switcher);

this.imageSwitcher = (ImageSwitcher) findViewById(R.id.switcher);

this.gallery = (Gallery) findViewById(R.id.gallery);



for (int i = 1; i <= 20; i++) {

this.imageAssetPathList.add("images/" + i + ".jpg");

}



this.imageSwitcher.setFactory(this);

this.gallery.setAdapter(new ImageAdapter(this, this.imageAssetPathList));

this.gallery.setOnItemSelectedListener(this);



}



@Override

public View makeView() {

ImageView imageView = new ImageView(this);

imageView.setBackgroundColor(0xFF000000);

imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);

imageView.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

return imageView;

}



@Override

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

try {

InputStream inputStream = super.getAssets().open(this.imageAssetPathList.get(position));

imageSwitcher.setImageDrawable(Drawable.createFromStream(inputStream, "" + position));

} catch (IOException e) {

e.printStackTrace();

}

}



@Override

public void onNothingSelected(AdapterView<?> parent) {



}



}
复制代码java代码: public class ImageAdapter extends BaseAdapter {



private Context content;

private ArrayList<String> imageAssetPathList;



public ImageAdapter(Context content, ArrayList<String> imageAssetPathList) {

this.content = content;

this.imageAssetPathList = imageAssetPathList;

}



@Override

public int getCount() {

if (this.imageAssetPathList != null) {

return this.imageAssetPathList.size();

} else {

return 0;

}

}



@Override

public Object getItem(int position) {

return null;

}



@Override

public long getItemId(int position) {

return 0;

}



@Override

public View getView(int position, View convertView, ViewGroup parent) {

try {

ImageView imageView;

imageView = new ImageView(this.content);

imageView.setAdjustViewBounds(true);

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

imageView.setPadding(0, 0, 0, 0);



InputStream inputStream = this.content.getAssets().open(this.imageAssetPathList.get(position));

imageView.setImageDrawable(Drawable.createFromStream(inputStream, "" + position));



return imageView;

} catch (IOException e) {

e.printStackTrace();

return null;

}

}



}
复制代码
时间控件

       android.widget. DigitalClock数字时钟,继承自android.widget.TextView。在android.widget包中。

       DigitalClock
       一般用法:
       调用方法getText(),可得到时间字符串。使用方法addTextChangedListener(android.text.TextWatcher)添加文字更改监听,则会每秒钟会激发一次事件。
      
     
       AnalogClock
       android.widget. AnalogClock模拟时钟,继承自android.view.View。在android.widget包中。
       模拟时钟。在界面显示一个带时针和分针的模拟时钟

        AnalogClock
        android.widget.TimePicker时间设置,继承自android.widget.FrameLayout(ViewGroup) 。在android.widget包中。
        TimePicker
        进行微调小时、分钟和 AM/PM(如果适用)。也可以键盘输入。AM/PM 下点击按钮选择。也可以使用此视图的对话框TimePickerDialog。
       方法getCurrentHour()得到当前小时(根据AM/PM),getCurrentMinute()得到当前分钟。
       方法setOnTimeChangedListener(TimePicker.OnTimeChangedListener),可对调节进行监听。

       DatePicker
       android.widget. DatePicker时间设置,继承自android.widget.FrameLayout(ViewGroup) 。在android.widget包中。
       进行微调年、月、日。也可以键盘输入。也可以使用此视图的对话框DatePickerDialog
       方法getYear()得到年, getMonth()月, getDayOfMonth()当月日。
       方法init(int year, int monthOfYear, int dayOfMonth, DatePicker.OnDateChangedListener onDateChangedListener),初始化年月日和调节监听。

       进度条

       android.widget. ProgressBar,继承自android.view.View 。在android.widget包中。对应对话框ProgressDialog。
ProgressBar有两种展示方式,表盘形式(普通、小、大)和条形填充形式。在layout定义时,需要通过设施style属性类设置展示方式。

常用属性设置:
style显示方式,取值:
?android:attr/progressBarStyleLarge / progressBarStyle / progressBarStyleSmall / progressBarStyleHorizontal
android:maxprogressBarStyleHorizontal方式时,进度条满时的值。
android:progressprogressBarStyleHorizontal方式时,进度条主进度当前值。
android:secondaryProgressprogressBarStyleHorizontal方式时,进度条次进度当前值。


       progressBarStyleHorizontal方式时,就需要指定进度条最大值,当前值,次要的当前值。还可以在代码中手动设置。

       通过按钮改变progress和secondaryProgress的代码:

java代码: if (v.equals(this.buttonSubBar)) {

this.myProgressBar.setProgress(this.myProgressBar.getProgress() - 10);

} else if (v.equals(this.buttonAddBar)) {

this.myProgressBar.setProgress(this.myProgressBar.getProgress() + 10);

} else if (v.equals(this.buttonSubSecondaryBar)) {

this.myProgressBar.setSecondaryProgress(this.myProgressBar.getSecondaryProgress() - 5);

} else if (v.equals(this.buttonAddSecondaryBar)) {

this.myProgressBar.setSecondaryProgress(this.myProgressBar.getSecondaryProgress() + 5);

}
复制代码      android.widget. SeekBar拖动进度条,继承自android.widget.AbsSeekBar(android.widget. ProgressBar) 。在android.widget包中。
常用属性设置:
android:max进度条满时的值。
android:progress进度条主进度当前值。
android:thumb拇指跟随图标。
android:thumbOffset设置允许的轨道的范围扩展到拇指的拇指偏移量。

       方法setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener) 可进行监听,开始拖拽。

java代码: this.mySeekBar = (SeekBar) super.findViewById(R.id.mySeekBar);



this.mySeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener);



*

*

/**

* seekBar 监听器

*/

private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {



@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

myTextSeekBar.setText(progress + "");

Log.v(CommonConfig.LOG_TAG, "SeekBar onProgressChanged, progress: " + progress + ", fromUser: " + fromUser);

}



@Override

public void onStartTrackingTouch(SeekBar seekBar) {

Log.v(CommonConfig.LOG_TAG, "SeekBar onStartTrackingTouch");

}



@Override

public void onStopTrackingTouch(SeekBar seekBar) {

Log.v(CommonConfig.LOG_TAG, "SeekBar onStopTrackingTouch");

}

};
复制代码   Android系统里面有3种类型的菜单:options menu,context menu,sub menu..
  options menu 按Menu键就会显示,用于当前的Activity..
  它包括两种菜单项:
  因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项..
  而多于6的菜单项会以“more” icon menu来调出,称为expanded menu..它不支持icon,其他的特性都和icon menu一样!
  在Activity里面,一般通过以下函数来使用options menu:
  Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用..
  Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用..
  Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项..
  context menu 要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起..
  这类型的菜单不支持icon和快捷键!
  在Activity里面,一般通过以下函数来使用context menu:
  Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用..
  Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu..ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数..
  Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项..
  sub menu
  以上两种menu都可以加入子菜单,但子菜单不能嵌套子菜单,这意味着在Android系统,菜单只有两层,设计时需要注意的!同时子菜单不支持icon..
  xml形式的menu定义及应用
  上述的三种类型的menu都能够定义为xml资源,但需要手动地使用MenuInflater来得到Menu对象的引用..
  一个菜单,对应一个xml文件,因为要求只能有一个根节点
  ..官方说声明可以不写,但我觉得还是写上好些,很多时候那个声明主要是为了声明编码格式utf-8之类的..xml文件保存为res/menu /some_file..xml..Java代码引用资源: R..menu..some_file
  接下来介绍相关的节点和属性(所有的属性都定义为android空间内,例如android:icon=”@drawable/icon”):
  根节点,没有属性..
  表示在它里面的在同一group..相关属性包括:
  id:group id
  menuCategory:对应 常量Menu CATEGORY_* — 定义了一组的优先权,有
  效值:container,system,secondary,和alternative
  orderInCategory:定义这组菜单在菜单中的默认次序,int值
  checkableBehavior:这组菜单项是否checkable..有效值:none,all(单选/单选按钮radio button),single(非单选/复选类型checkboxes)
  visible:这组菜单是否可见 true or false
  enabled:这组菜单是否可用,true or false
  菜单项,可以嵌入
  作为子菜单..相关属性包括:
  id: item id
  menuCategory: 用来定义menu类别
  orderInCategory: 用来定义次序,与一个组在一起(Used to define the order of the item, within a group)
  title: 标题
  titleCondensed:标题摘要, 当原标题太长的时候,需要用简短的字符串来代替title
  icon: icon 图标
  alphabeticShortcut: 字母快捷键
  numericShortcut:数学快捷键
  checkable:是否为checkbox, true or false
  checked:是否设置为checked状态,true or false
  visible: 是否可见, true or false
  enabled:是否可用,true or false

java代码: <?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/item1"

android:title="Item 1"

android:icon="@drawable/icon"

android:checkable="true"

android:checked="false"

/>



<group android:id="@+id/group_1"

android:checkableBehavior="single">

<item android:id="@+id/group_item1"

android:title="Item 1 in group"

/>

<item android:id="@+id/group_item2"

android:title="Item 2 in group"

android:checked="true"

/>

</group>



<item android:id="@+id/submenu"

android:title="Sub Menu">

<menu>

<item android:id="@+id/submenu_item"

android:title="Sub Menu Item"

/>

</menu>

</item>



<item android:id="@+id/item3"

android:title="item 3"

android:checkable="true"

android:checked="true"

/>



</menu>
复制代码java代码: public void onCreate(Bundle savedInstanceState) {

...

registerForContextMenu(editText);

}



@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);



getMenuInflater().inflate(R.menu.menu1, menu);

}
复制代码   由于这是contextMenu,所以可以看到即使xml定义里面的item1.seticon了,但还是没有显示出来的,即那语句是无效的!

       另外,要明确的是,要显示radio,需要用group,而group里面的item设置了checked = true即选中。而 checkable和checked的区别,一开始我是很困惑的,但写了代码并运行后,明白它们的区别了: checkable=true表示这个item是checkbox,checked则表示是否选中。所以对于checkbox item,最好先写 checkable=”true”,然后再写checked。

java代码: private static final int MENU_GROUPITEM1 = Menu.FIRST + 8;

private static final int MENU_GROUPITEM2 = Menu.FIRST + 9;

private static final int MENU_ITEM1 = Menu.FIRST + 10;



public void onCreate(Bundle savedInstanceState) {

...

registerForContextMenu(findViewById(R.id.edittext));

}



@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);



menu.add(1,MENU_ITEM1,Menu.NONE, "Item 1").setCheckable(true).setChecked(false);



// Group ID

int groupId = 0;

// The order position of the item

int menuItemOrder = Menu.NONE;



menu.add(groupId, MENU_GROUPITEM1, menuItemOrder, "Item 1 in group");

menu.add(groupId, MENU_GROUPITEM2, menuItemOrder, "Item 2 in group")

.setChecked(true);

menu.setGroupCheckable(groupId, true, true); //这句要写在group item的最后



SubMenu subMenu = menu.addSubMenu("Sub Menu 1");

subMenu.add("Sub Menu Item")

.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

@Override

public boolean onMenuItemClick(MenuItem item) {

Toast.makeText(HelloDemo.this,

"Sub Menu Item selected",

Toast.LENGTH_SHORT).show();

return true; //true表示完成当前item的click处理,不再传递到父类处理

}

});



menu.add("Item 3").setCheckable(true).setChecked(true);

}
复制代码在编写过程中,发现groupId的影响很大,不推荐使用Menu.add(int titleRes)和add(CharSequence title)方法来添加MenuItem,因为没有指定groupID,默认为0,这样子和后面的menu group 一组了,导致执行完menu.setGroupCheckable(groupId, true, true)后同一group的Item都变成radio。

java代码: @Override

public boolean onCreateOptionsMenu(Menu menu) {

// Group ID

int groupId = 0;

// The order position of the item

int menuItemOrder = Menu.NONE;



menu.add(groupId, MENU_COPY, menuItemOrder, "Copy")

.setIcon(R.drawable.icon);

menu.add(groupId, MENU_EDIT, menuItemOrder, "Edit");

menu.add(groupId, MENU_PASTE, menuItemOrder, &quotaste");

menu.add(groupId, MENU_DELETE, menuItemOrder, "Delete");

menu.add(groupId, MENU_OK, menuItemOrder, "Ok");

menu.add(groupId, MENU_CANCEL, menuItemOrder, "Cancel");

menu.add(groupId, MENU_TEST, menuItemOrder, "Test");

menu.add(groupId, MENU_DEMO, menuItemOrder, "Demo");

// .setIcon(R.drawable.icon); more expand menu 不支持icon, setIcon不会报错,但运行时还是看不到icon的



//return super.onCreateOptionsMenu(menu);

return true; //true表示要显示menu; false表示不显示menu

}
复制代码   处理菜单点击事件
       方法一:
       利用菜单自带的监听器功能,直接监听,就象处理控件事件一样,像上面的ContextMenu的subMenu.add(“Sub Menu Item”)设置MenuItem.OnMenuItemClickListener。

       方法二:
       在Activity和View都直接提供了一个菜单点击统一处理函数,
       ActivitynOptionsItemSelected (MenuItem item) ;
       Activity::onContextItemSelected(MenuItem item) ;

java代码: @Override

public boolean onOptionsItemSelected(MenuItem item) {

switch(item.getItemId()){

case MENU_COPY:

Toast.makeText(this, "Copy Item selected", Toast.LENGTH_SHORT).show();

break;



default: break;

}

return false;//false表示继续传递到父类处理

}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 08:12 , Processed in 0.316263 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表