UI高总结
来源:互联网 发布:淘宝官方网址是多少 编辑:程序博客网 时间:2024/06/10 18:49
滚动监听 OnScrollListener
应用手机通讯录,上拉加载下拉刷新,
使用:
为lv添加此滚动监听:
lv.setOnScrollListener(){}
重写的方法
onScrollStateChanged滚动状态发生改变
三种滚动状态:
SCROLL_IDLE 闲置状态
SCROLL_FLING 滚动惯性状态
SCROLL_TOUCH_SCROLL 触摸滚动状态
onScroll滚动中
firstVisibleItem 第一个可见条目的position
VisibleItemCount可见条目的总数
totalItemCount总条目个数
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {//滚动状态
//用OnScrollListener调用
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
break;
case OnScrollListener.SCROLL_STATE_FLING:
break;
case OnScrollListener.SCROLL_STATE_IDLE:
tv.setVisibility(View.INVISIBLE);
break;
default:
break;
}
}
//滚动中的方法
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
String str=list.get(firstVisibleItem).substring(0,1);
tv.setText(str);
tv.setVisibility(View.VISIBLE);
}
});
二级列表ExpandableListView
Expandable可扩展的
1.层级关系
AbsListView
ListView
ExpandableListView
GridView
2.特点
垂直滚动的二级列表,数据来自于BaseExpandableListAdapter
3.准备数据
一级数据 String[] groups={};可以是集合ArrayList<Object>,可变,也可以放置对象,因为每一级列表都可以设置item,可以是复杂界面
二级数据String[][] childs={{},{},{}};也可以是集合ArrayList<ArrayList<Object>> 可以设置复杂界面item
4.注意:isChildSelectable(子级是否能被点击) 返回值要设置为true,只有这样子级列表才能点击,
5.设置监听
设置子级监听 onChildClickListener
Handler的三种使用方法
只有主线程才能更新ui,进度条的相关控件的更新 是特例,只有子线程能做耗时操作
介绍消息处理机制的运行原理
在主线程维护一个Looper轮询器对象,一直检测着MessageQueue消息池是否有消息进来。
Handler负责发送消息到消息池,并且处理里面的消息
Message创建对象:
方式一:不管消息池有没有一样的消息,都重新创建
Message msg = new Message();
方式二:先判断消息池中是否有一样的,如果有就复用
Message msg=Message.obtain();
为属性赋值
msg.obj=对象
msg.arg1=整数
msg.arg2=整数
msg.what=整数(标识数字)
第一种方法:
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
}
};
new Thread(){
public void run(){
int i=0;
while(true){
SystemClock.sleep(100);//睡100毫秒
i++;
pb.setProgress(i);
handler.sendEmptyMessage(i);
}
}
}.start();
第二种方法:
Handler handler=new Hander();
//创建一个Timer对象,能够循环调用里面的run方法
Timer timer=new Timer();
timer.schedule(new TimerTask() {
private int tbotime;
@Override
public void run() {
tbotime = player.getCurrentPosition();
seek.setProgress(tbotime*seek.getMax()/zongtime);
handler.post(new Runnable() {
@Override
public void run() {
botime.setText(sdf.format(new Date(tbotime)));
}
});
}
}, 0, 100);
这里的0是延迟
100是隔多少毫秒调用一次里面的run方法
可以用handler.post(new Runnable(){});直接更新UI
第三种方法就是可以直接在子线程中使用
runOnUiThread(new Runnable(){}) 在子线程中更新UI
这里注意:
在Fragment中没有runOnUiThread方法,所以要用第二种,
先创建一个Handler对象,然后使用handler.post();更新UI
帧动画
AnimationDrawable
创建方式一:xml中实现帧动画
第一步
先创建一个drawable文件夹,然后创建一个animation-list(第一个),
然后手写item,因为没有自动填充代码,
<item
android:drawable="@drawable/girl_1" android:duration="100"/>
Drawable是图片资源,duration是持续时间
把每一帧动画都添加到里面,
第二步
image2.setBackgroundResource(R.drawable.ad);
AnimationDrawable back = (AnimationDrawable) image2.getBackground();
back.setOneShot(false);
back.start();
先给image设置背景图片为帧动画的xml
然后在获取这个image的这个背景,转换为动画图片AnimationDrawable类,然后设置是否循环一次,开启这个动画
创建方式二:代码中实现帧动画
第一步:
先创建一个动画图片,AnimationDrawable对象
AnimationDrawable ad=new AnimationDrawable();
第二步:
为这个动画图片对象,添加帧
ad.addFrame(getResources().getDrawable(R.drawable.girl_1), 100);
第三步:
为image控件设置背景为动画图片
Image.setBackgroundDrawable(ad);
然后开启这个动画图片 ad.start();
补间动画
补间动画需要注意的:如果几个动画集合里面有平移的话,一定要放到最后,
方式一:xml
第一步:
在res文件夹下创建anim文件夹,然后创建对应的动画文件
然后写各种参数
百分比
第二步:
在代码中使用AnimationUtils.loadAnimation(Context,id)创建动画对象,这里的AnimationUtils是一个工具包,可以通过它创建动画,
然后给image设置这个动画:
Animation load = AnimationUtils.loadAnimation(MainActivity.this, R.anim.tran);
image1.startAnimation(load);
方式二:
TranslateAnimation
ta=newTranslateAnimation(Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 1);
ta.setDuration(3000);
image.setAnimation(ta);
AlphaAnimation 透明度渐变动画
TranslateAnimation 位移动画
RotateAnimation 旋转动画
ScaleAnimationn 缩放动画
AnimationSet 动画合集,实现多种动画组合的效果
平移的时候不管是在xml中还是再代码中设置都要放到动画集合的最后,
在代码中平移时XY轴的0是相对于图片现有的位置,如果是0的话,image放在哪里,就从哪里开始
动画监听:
setAnimationListener
onAnimationStart
onAnimationRepeat
onAnimationEnd(动画结束的时候)
ViewPager
第一步:
在xml文件中引入
<android:support.v4.view.ViewPager />
第二步:
准备布局layout page1,page2,page3....
第三步:
代码中:
1.找控件
2.准备数据
List.add(View.inflate());
3.设置适配器PagerAdapter
getCount
isViewFromObject
instatiantItem(需要添加)
destroyItem(需要添加)
第四步:
监听器:OnPageChangeListener
onPageSelected
设置当前vp显示页面 vp.setCurrentltem(position);
设置ViewPager的选项卡,可以结合RadioGroup,和选择器
RadioButton设置button属性,来设置选择器,选择器中用checked
在代码中可以把选项卡控件,也就是button也可以是image或者text放入一个集合中,然后添加监听的时候setCilckListener(this),让类去实现这个接口,重写onCilck方法,去遍历集合判断,然后设置vp的显示页,这样做比较方便,
在vp的监听中也可以遍历这个选项卡集合,改变他的状态或者颜色
//遍历给选项卡集合设置监听
for (TextView text : texts) {
text.setOnClickListener(this);
}
//重写监听事件,如果事件源的id和text的id相等的话,改变它的颜色然后让vp选中当前页面,
@Override
public void onClick(View arg0) {
int i=0;
for (TextView text : texts) {
if(text.getId()==arg0.getId()){
text.setBackgroundColor(Color.RED);
vp.setCurrentItem(i);
}else{
text.setBackgroundColor(Color.WHITE);
}
i++;
}
}
//如果页面被选中的话,for循环,
public void onPageSelected(int arg0) {
for (int i = 0; i < texts.size(); i++) {
//如果当前vp的页面下表和控件一致的话
if(arg0==i){
//设置选项卡背景颜色
texts.get(i).setBackgroundColor(Color.RED);
}else{
texts.get(i).setBackgroundColor(Color.WHITE);
}
}
}
Fragment 碎片,片段(主要两种跳转方式,`传值)
Fragment是一个片段、碎片,嵌套在Activity中使用,一个Activity可以有多个Fragment,而一个Fragment可以使用在多个Activity上。
它具有自己的生命周期,具有自己的事件交互,所以是一个完整的功能模块,依赖于Activity
Fragment和ViewPager结合
先创建Fragment类,然后在ViewPager准备数据的时候,把Fragment的对象添加到集合中,然后在添加到ViewPager中,这里的选项卡,用RadioButton进行实现.
这里的ViewPager的适配器要用FragmentPagerAdapter进行适配,并且里面要传一个FragmentManger参数(getSupportFragmentManager())
把RadioGroup中的所有RadioButton放到集合中,比较方便操作,如果点击选项卡跳转到相应的pager中,给rg设置监听,
for (int i = 0; i <buttons.size(); i++) {
if(buttons.get(i).getId()==checkedId){
vp.setCurrentItem(i);
}
}
然后给ViewPager设置监听,如果滑动到指定的页面,RadioButton也跟着改变.
vp.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
buttons.get(arg0).setChecked(true);
}
Fragment的两种加载方式
方式一:replace方法
这种方式先在activity中设置一个Fragment,然后在Fragment中如果要跳转到第二个Fragment中的话,用transaction.replace(R.id.fl, f2, "f2").commit();
的方法进行替换,上面要new一个新的f2,这个f2可以添加一个bundle,用来携带参数
FragmentTransaction transaction =manager.beginTransaction();
Fragment2 f2 = new Fragment2();
Bundle bd=new Bundle();
bd.putString("name", tname);
bd.putString("age", tage);
f2.setArguments(bd);
transaction.replace(R.id.fl, f2,"f2").commit();
然后在第二个Fragment中通过getArguments();获取这个bundle,然后获取里面的参数.
方式二:隐藏显示方法,设置公共变量,或者方法
首先在MainActivity中要把两个Fragment都添加进去,然后创建一个显示的方法
Show(String tag)自定义
然后在show方法中使用transaction的show和hide方法进行显示隐藏
transaction.add(R.id.fl, f1, "f1");
transaction.add(R.id.fl, f2, "f2");
transaction.commit();
show("f1");
public void show(String tag) {
FragmentTransaction transaction = manager.beginTransaction();
if("f1".equals(tag)){
transaction.show(f1);
transaction.hide(f2);
}else if("f2".equals(tag)){
transaction.show(f2);
transaction.hide(f1);
}
transaction.commit();
}
这种方法在activity中就直接把两个Fragment都加载了,所以F1如果想调到F2,就调用activity的show(“f2”)方法就行,另外activity也要强转为MainActivity
因为这个方法是MainAcitvity中的,
用这种方法传值的话,要在F2中设置public的变量,然后在F1中获取MainActivity,通过这个activity的findFragmentByTag(“f2”)方法获取F2,
然后为F2中的公共变量赋值,跳转的时候调用activity中的show(“f2”)方法
小点:
选择器:
image如果设置选择器的话,要在代码中用selected控制
Button按钮设置选择器,用pressed=”true” 代码中设置
backgroud=”@drawable/sel”
CheckBox设置选择器,用checked=”true”
<item
android:state_checked="true"
android:drawable="@drawable/jy_checkbox_on"/>
<item
android:state_checked="false"
android:drawable="@drawable/jy_checkbox_off"/>
然后再设置android:button="@drawable/sel"
RadioButton设置选择器和CheckBox一样
ExpandableListView要设置下拉图标的选择器的话要在item中写(是否下拉状态)expanded=”true”或者”false” 没有提供提示,所以要自己写,
然后android:groupIndicator="@drawable/sel"
ListView中也可以添加选择器,按压的话改变当前条目的背景,颜色
也可以直接写
android:listSelector="#f00" 如果点击的话就是当前设置的颜色
这个是按压式的
android:listSelector="@drawable/sel"
<item
android:state_pressed="true" android:drawable="@android:color/holo_green_light"/>
ExpandableListView如果要取消默认图标要用
android:groupIndicator="@null"
或者在代码中设置setGroupIndicator(null)
ListView中设置两个item的分隔线的时候
android:divider="#f00"(可以是颜色,也可以是图片)
android:dividerHeight="1dp"
TextView可以设置maxLines,然后也可以设置后缀....ellipsize=”end”
Color.alpha(0);设置颜色为透明,和背景一致
//也可以在xml文件中设置颜色
<item
android:state_selected="true" android:drawable="@android:color/holo_green_dark"/>
Handler
在主线程维护着一个Looper轮询器,Looper中有一个死循环时刻监视着消息池中有没有消息进来,如果有的话,交给handler去处理.消息池中的消息也是从handler中发送出去的
<activity>中设置configChanges=”orientation|keyboardHidden”防止横竖屏重启activity
File file=Environment.getExternalStorageDirectory();
获取外部存储路径
裁剪照片
public void crop(Uri uri){
Intent intent=new Intent();
intent.setAction("com.android.camera.action.CROP");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(uri, "image/*");
//是否要裁剪
intent.putExtra("crop", true);
//x和y的宽高比
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//宽和高的像素
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
//裁剪后的照片格式
intent.putExtra("outputFormat", "JPEG");
//是否返回
intent.putExtra("return-data", true);
//因为需要裁剪后的照片
startActivityForResult(intent, 2);
}
关闭服务,关闭音乐
要放到super的前面,因为super就关闭了
protected void onDestroy() {
// TODO Auto-generated method stub
binder.callStop();
unbindService(conn);
super.onDestroy();
}
Fragment和ViewPager结合的话要使用专门的Adapter:FragmentPagerAdapter(manager)
并且里面要传递manager管理器
vp.setAdapter(new FragmentPagerAdapter(manager) {
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}
});
如果添加服务的话,销毁activity的时候记得要解绑,如果有音乐的话可以在这里取消音乐
@Override
protected void onDestroy() {
binder.callStop();
unbindService(conn);
super.onDestroy();
}
隐藏标题栏:
oncreate方法中添加:
requestWindowFeature(Window.FEATURE_NO_TITLE);
请求把窗口风格设置为没有标题的风格
由于在package="com.example.test"中已经指示过该app的包名,所以下面的name=".MainActivity",可以直接写 .类名
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>(intent过滤器)
<action android:name="android.intent.action.MAIN" />
(活动)
<category(种类) android:name="android.intent.category.LAUNCHER"(发射器) />
</intent-filter>
</activity>
使用日志工具Log
Log.d(tag,msg)
布局填充器
LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
View view = inflater.inflate(R.layout.item,null);
先获取一个布局填充器,然后调用填充的方法;里面传一个上下文对象
View.inflate();直接通过View的inflate方法进行填充
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item, null);
先通过服务获取布局填充器,里面有一个常量值,LAYOUT_INFLATER_SERVICE
- UI高总结
- UI总结
- ui总结
- UI总结
- UI总结
- android UI高仿
- 高仿UI特效专辑
- 高仿UI特效专辑
- UI控件自适应宽高
- dui高性能UI-FutureUI
- J2ME高级UI总结
- UI展现技术总结
- android--UI组件总结
- android--UI组件总结
- Android UI设计总结
- UI定制总结
- Android UI TabHost总结
- Android UI设计总结
- http状态协议码大全
- iOS属性声明strong和retain竟然不一样
- Web.xml配置详解之context-param
- docker1.1 新特性--libnetwork模块
- ubuntu+nginx 出现502 bad gateway解决方法
- UI高总结
- sql查询20到30条记录
- Android drawPath的简单使用
- Firefox必备的24款web开发插件
- Android 蓝牙
- PullToRefresh
- Maven学习总结(一)——Maven入门
- GlobalSign 企业型SSL 证书
- docker学习记录