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,就调用activityshow(“f2”)方法就行,另外activity也要强转为MainActivity

因为这个方法是MainAcitvity中的,

用这种方法传值的话,要在F2中设置public的变量,然后在F1中获取MainActivity,通过这个activityfindFragmentByTag(“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

1 0