动画描述: 动画与底部菜单一样出现和消失
制作过程:
1. 创建两个动画文件
window_in.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:fromYDelta="1000" android:toXDelta="0" android:toYDelta="0" /> </set>window_out.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="1000" /> </set>
<style name="main_menu_animstyle"> <item name="android:windowEnterAnimation">@anim/settingswindow_in_anim</item> <item name="android:windowExitAnimation">@anim/settingswindow_out_anim</item> </style>
3. 将动画应用于Dialog:
Window window = dialog.getWindow(); //设置显示动画 window.setWindowAnimations(R.style.main_menu_animstyle); WindowManager.LayoutParams wl = window.getAttributes(); wl.x = 0; wl.y = getWindowManager().getDefaultDisplay().getHeight(); //设置显示位置 dialog.onWindowAttributesChanged(wl);//设置点击外围解散 dialog.setCanceledOnTouchOutside(true); dialog.show();
在我们的日常开发中,ListView是一个最常用的组件,所以我们非常有必要对它的属性进行全面的了解。现在就以一个简单的实例,对ListView的属性做一个简单的讲解。
首先我们给出简单的布局文件,就一个简单的ListView列表:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFE1FF" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Activity文件,使用ArrayAdapter对列表进行填充:
public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = (ListView) findViewById(R.id.listView1); final List<String> adapterData = new ArrayList<String>(); for (int i = 0; i < 20; i++) { adapterData.add("ListItem" + i); } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, adapterData); listView.setAdapter(adapter); } }
运行效果如下:
接下来我们在布局的ListView中添加如下属性,并演示其效果。
1.android:stackFromBottom属性:在ListView和GridView中使用,使它们的内容从底部开始显示。
布局文件修改如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:stackFromBottom="true" />
运行效果如下,列表在开始的时候,内容就从底部开始显示:
2.android:transcriptMode属性:设置列表的transcriptMode模式,该模式指定列表添加新的选项的时候,是否自动滑动到底部,显示新的选项。
disabled:取消transcriptMode模式,默认的
normal:当接受到数据集合改变的通知,并且仅仅当最后一个选项已经显示在屏幕的时候,自动滑动到底部。
alwaysScroll:无论当前列表显示什么选项,列表将会自动滑动到底部显示最新的选项。
布局修改如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:stackFromBottom="true" android:transcriptMode="alwaysScroll" />
Activity文件代码如下:
public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView1); final List<String> adapterData = new ArrayList<String>(); for (int i = 0; i < 20; i++) { adapterData.add("ListItem" + i); } final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, adapterData); listView.setAdapter(adapter); //定时给列表添加新的选项,并通知列表更新 final Handler handler = new Handler(); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { adapterData.add("New ListItem"); handler.post(new Runnable() { @Override public void run() { adapter.notifyDataSetChanged(); } }); } }, 3000, 3000); }运行结果如下:
6秒后的结果(每当添加新的表项的时候,列表自动滑动的底部显示最新的表项)
其它两个normal和disable属性就不在演示,如上已经解释的比较清楚,大家可以自己试验感受一下。
3.android:cacheColorHint属性:该属性在官方文档和个资料中找不到比较好的描述;根据实际的体验,当你设置的ListView的背景时,应该设置该属性为“#00000000”(透明),不然在滑动的时候,列表的颜色会变黑或者背景图片小时的情况!
4.android:divider属性:列表之间绘制的颜色或者图片。一般开发中用于分隔表项。
在实际开发过程中,如果你不想要列表之间的分割线,可以设置属性为@null,布局文件如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@null" />
运行结果如下:
5.android:fadingEdge属性:设置列表的阴影
布局文件如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/ic_launcher" android:cacheColorHint="#000000ff" android:fadingEdge="vertical" android:fadingEdgeLength="40dp"/>
运行效果如下:
6.android:fastScrollEnabled属性:启用快速滑动条,它能快速的滑动列表。但在实际的测试中发现,当你的数据比较小的时候,是不会显示快速滚动条。
布局文件如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:fastScrollEnabled="true" />
运行结果如下(当你快速滑动列表的时候,就出现如下快速滑动滚动条):
7.android:listSelector属性:用来指明列表当前选中的选项的图片
布局文件如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:listSelector="@drawable/ic_launcher" />
运行结果如下(当用手指点击ListItem3的时候,出现如下效果,图片显示在ListItem3的底部,并未遮挡ListItem3):
8.android:drawSelectorOnTop属性:当设置为true时候,listSelector的图片将会被绘制在被选中的选项之上。
布局文件如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:drawSelectorOnTop="true" android:listSelector="@drawable/ic_launcher" />
运行结果如下(对比上面,发现图片遮挡了ListItem3的显示):
9.android:choiceMode属性:定义了列表的选择行为,默认的情况下,列表没有选择行为。
none:正常不指定选择的列表
singleChoice:列表允许一个选择
multipleChoice:列表允许选择多个
mutipleChoiceModal:
布局文件如下:
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="multipleChoice" />
Activity文件如下:
public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView1); final List<String> adapterData = new ArrayList<String>(); for (int i = 0; i < 40; i++) { adapterData.add("ListItem" + i); } //只有使用支持选择的布局才能选择多项 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, adapterData); listView.setAdapter(adapter); listView.setFastScrollEnabled(true); } }
运行结果如下(点击多个选项),关于nono和singleChoice可以自己尝试一下:
本文转自http://blog.csdn.net/llhhyy1989/article/details/7388059,做部分整理。
Java中的流,可以从不同的角度进行分类。
按照数据流的方向不同可以分为:输入流和输出流。
按照处理数据单位不同可以分为:字节流和字符流。
按照实现功能不同可以分为:节点流和处理流。
输出流:
输入流:
因此输入和输出都是从程序的角度来说的。
字节流:一次读入或读出是8位二进制。
字符流:一次读入或读出是16位二进制。
字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。
节点流:直接与数据源相连,读入或读出。
直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。
处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。
Jdk提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。
以下是java中io中常用的流。
字节输入流:
字节输出流:
字符输入流:
字符输出流:
简单介绍其上图:
对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)
对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)
PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。
字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。
Buffered缓冲流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。
转化流:InputStreamReader/OutputStreamWriter,把字节转化成字符。
数据流:DataInputStream,DataOutputStream。
因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。
打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方。
对象流:ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。
序列化流:SequenceInputStream。