2016/3/4 星期二
1、ViewFilpper:
实现左右滑动动画效果;
2、ViewAnimator:
多动态标题栏;
3、Thread/runable多线程的区别;
一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限;
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比
继承Thread类有如下好处:
->避免点继承的局限,一个类可以继承多个接口。
->适合于资源的共享
4、Ation:
规定了Intent要完成的动作,是一个字符串常量。使用setAction()来设置Action属性,使用getAction()来获得Action属性。
既可以使用系统内置的Action,也可以自己定义。系统自定义的action,如ACTION_VIEW, ACTION_EDIT, ACTION_MAIN等等。
5、Animation:动画
6、SetBackGround+XXX:
设置这个View背景;+Drawbale:设置为Drawable对象;+Color:参数为Color对象;+Resoure:参数为资源ID;
7、Folat.parseFloat(String)
表示把String字符串转换成float原始类型的单精度数值;Float.ValueOf(String)是把String字符串转换成float的封装类Float;floatalue()
的作用是把封装类的Foloat转换成原始类型float;ps:float是数值,而Float是一个类;
8、SetSeclection(items)调用指定的items
9、cmd命令调试adb,删除、安装、重启;
adb remount:获取权限
adb shell:进入adb内部
adb rm .apk删除应用程序
adb push .apk system/app:安装系统应用
adb reboot:重启
10、Clasclasscastexception:
类型转换错误,当前者域小于后者的时候出现,例如:前者A是子类的对象,而后者B是父类的对象,若使用A=B,就会抛出这个错误;
11、快捷注释键 Ctrl+Shift+/;Ctrl+Shift+C;
12、基于framework开发
13、Handler.removeCallbacksAndMessages(null):避免内存泄漏
14、inClude():
为了减少在同一个xml中的代码冗余,提高可读性,把相同布局的代码单独写成一个模块,重用layout,相当于把原来代码中的一部分独立出来;
15、gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));去除点击GridView后系统设定的背景色
android:scrollbars设置滚动条显示:none(隐藏),horizontal(水平),vertical(垂直)
android:scrollbarTrackVertical:设置垂直滚动条背景(轨迹)的drawable注意直接设置颜色值
android:scrollbarTrackHorizontal:设置水平滚动条背景(轨迹)的色drawable(如颜色)
android:scrollbarThumbVertical:设置垂直滚动条的drawable(如颜色).
例如:android:scrollbarThumbVertical="@drawable/scroll_bar"
android:scrollbarThumbHorizontal设置水平滚动条的drawable(如颜色)。
android:scrollbarStyle:可以定义滚动条的样式和位置,可选值有insideOverlay、insideInset、outsideOverlay、outsideInset四种。
其中inside和outside分别表示是否在view的padding区域内,overlay和inset表示覆盖在view上或是插在view后面,所以四种值分别表示:
insideOverlay:默认值,表示在padding区域内并且覆盖在view上
insideInset:表示在padding区域内并且插入在view后面
outsideOverlay:表示在padding区域外并且覆盖在view上,推荐这个
outsideInset:表示在padding区域外并且插入在view后面
android:scrollbarSize:设置滚动条的宽度。
android:scrollbarFadeDuration:设置滚动条淡出效果(从有到慢慢的变淡直至消失)时间,以毫秒为单位
android:scrollbarDefaultDelayBeforeFade:设置N毫秒后开始淡化,以毫秒为单位。
android:scrollbarAlwaysDrawVerticalTrack:设置是否始终显示垂直滚动条。这里用ScrollView、ListView测试均没有效果。
android:scrollbarAlwaysDrawHorizontalTrack:设置是否始终显示垂直滚动条。这里用ScrollView、ListView测试均没有效果。
android:fadeScrollbars:是否隐藏滚动条
16、getTag:返回视图的标记
17、*scroollview可以添加监听ScrollViewListener后,重写onScrollChanged(ObservableScrollView observableScrollView,
int x, int y, int oldx, int oldy) {}精准实现滑动页面监听;
//获取页面移动的监听
@Override
public void onScrollChanged(ObservableScrollView observableScrollView,
int x, int y, int oldx, int oldy) {
int scrollY=observableScrollView.getScrollY();//顶端以及滑出去的距离
int height=observableScrollView.getHeight();//界面的高度
int scrollViewMeasuredHeight=observableScrollView.getChildAt(0).getMeasuredHeight();//scrollview所占的高度
if(scrollY==0){//在顶端的时候
button_up.setBackgroundResource(R.drawable.upb);//向上的键为灰色
button_up.setClickable(false);//且不能按
}else if((scrollY+height)==scrollViewMeasuredHeight){//当在底部的时候
button_down.setBackgroundResource(R.drawable.downb);
//向下的键为灰色
button_down.setClickable(false);
//且不能按
}else {//当在中间的时候
button_down.setBackgroundResource(R.drawable.button_down);//向下为白色
button_down.setClickable(true);
//可点击
button_up.setClickable(true);//可点击
button_up.setBackgroundResource(R.drawable.button_up);
//向上的键为白色
}
}
*smoothScrollBy()方法可以通过OnClick实现点击页面滑动;
GridView的滚动监听就没搞明白,因为GridView的滚动界面会实时变动,导致暂时无法准确地监听;待攻关!
已攻关!2016/3/22 星期二 下午 7:19:40
详见29
18、Handler:
主要作用是介绍子线程的数据,并用此数据来配合主线程更新UI;handler可以分发Message对象和Runnable对象到主线程中;
1.安排Message或Runnable在某个主线程中某个地方执行;
2.安排一个动作在不同的线程中执行;
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
2016/3/21 星期一
19、WakeLock机制:阻止APP进入休眠状态:
为确保应用程序中的关键代码执行,使用应用程序有权通过代码阻止APP进入休眠状态,阻止屏幕变暗;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
WakeLock sCpuWakeLock = pm.newWakeLock(
PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP,"okTag");
if (sCpuWakeLock!= null) {
sCpuWakeLock.release();
sCpuWakeLock = null;
}
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
ACQUIRE_CAUSES_WAKEUP:不会唤醒设备,强制屏幕马上高亮显示,键盘灯开启。有一个例外,如果有notification弹出的话,会唤醒设备。
ON_AFTER_RELEASE:WakeLock 被释放后,维持屏幕亮度一小段时间,减少WakeLock 循环时的闪烁情况
如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时 如果申请了其它的wakelocks,按Power键,
系统还是会进Sleep
20、Alarm Manager:
AlarmManage有一个AlarmManagerService,该服务程序主要维护app注册下来的各类Alarm,并且一直监听Alarm设备,一旦有Alarm触发,
或者是Alarm事件发生,AlarmManagerService就会遍历Alarm列表,找到相应的注册Alarm并发出广播
Alarm Manager会维持一个cpu的wake lock。这样能保证电话休眠时,也能处理alarm的广播。一旦alarm receiver的onReceive() 方法执行完,
wake lock会迅速被释放。如果在receiver中开启一个service,有可能service还没启动,wake lock已经被释放了。所以此时要实现单独的wake lock策略。
有4种Alarm类型:
1)RTC_WAKEUP
在指定的时刻(设置Alarm的时候),唤醒设备来触发Intent。
2)RTC
在一个显式的时间触发Intent,但不唤醒设备。
3)ELAPSED_REALTIME
从设备启动后,如果流逝的时间达到总时间,那么触发Intent,但不唤醒设备。流逝的时间包括设备睡眠的任何时间。注意一点的是,
时间流逝的计算点是自从它最后一次启动算起。
4)ELAPSED_REALTIME_WAKEUP
从设备启动后,达到流逝的总时间后,如果需要将唤醒设备并触发Intent。
21、adb死循环挂起:
试过了任务管理器结束adb进程,重启eclipse,reset adb方法依然没有解决问题,基平先把数据线拔了,然后任务管理器里
删除adb.EXE,然后在用户环境变量里增加了一个变量名为:ANDROID_ADB_SERVER_PORT;变量值:51234;意图是让eclipse独有一个adb线程;
之后,就再没出现问题;
22、增加adb系统变量:
名:ADB_HOME;值:F:\java\android-sdk-windows\platform-tools;之后,打开cmd,可以直接adb.shell,控制模拟器!
23、notfindclassexception错误:
之前一直是出现此类问题只能cmd删除包、app的方法就可以1/3的几率解决问题,
新建项目,再cope代码报的是非法操作的错误,问群里,回答是没有回调
public void notifyDataSetChanged() {super.notifyDataSetChanged();},我在adapter里添加了该方法依然没解决,
基平把项目里的v7v4包全删了,然后在v4的源代码放到项目里,接着把initView()末端的viewPager.setAdapter(vpAdapter);
放到了initData()类末端;程序就能正常运行,因为是adapter起冲突了;
24、消除gridview、listview、scroollview消除拖动阴影的方法:
view.setOverScrollMode(View.OVER_SCROLL_NEVER):
25、ListView监听滑动到顶部和底部的方法:
ListView().setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem==0){
Log.e("log", "滑到顶部");
}
if(visibleItemCount+firstVisibleItem==totalItemCount){
Log.e("log", "滑到底部");
}
}
});
2016/3/22 星期二
26、ListView:
Android:cacheColorHint="#00000000":滑动不变背景
ListView.setSelector(R.drawable.adapter_background);设置点击变换背景
加载item动画:
动画效果: <alpha
android:duration="300"
android:fromAlpha="0"//初始透明度
android:toAlpha="1.0" />//结束透明度
</set>
动画文件:<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="2"
android:animationOrder="normal"
android:animation="@anim/list_anim"/>
然后在ListView中添加动画文件:
android:layoutAnimation="@anim/list_anim_layout"
接着在Adapter里将动画加载进去:
Animation animation = (Animation) AnimationUtils.loadAnimation(mContext, R.anim.list_anim);
LayoutAnimationController lac = new LayoutAnimationController(animation);
lac.setDelay(0.4f); //设置动画间隔时间
lac.setOrder(LayoutAnimationController.ORDER_NORMAL); //设置列表的显示顺序
mListView.setLayoutAnimation(lac); //为ListView 添加动画
27、动态实现listview选中的item固定与顶端的距离;
listView.setSelectionFromTop(int position, int Y):
Y:为当前item距离顶部的距离;
position:当前选择item;
*实现点击任何按钮界面,listview都会显示当前播放歌曲item为列表固定位置;
listView.setAdapter(mAdapter);//重新加载列表
//固定离顶端距离
if (songfile.size() > 6) {
try {
mTrackList.setSelectionFromTop(mService.getQueuePosition(), 115);
} catch (RemoteException e) {
e.printStackTrace();
}
}
28、点击事件模板:
button=(Button) findViewById(R.id.button1);
button.setOnClickListener(ClickListener);
private View.OnClickListener ClickListener = new View.OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Toast.makeText(MainActivity.this, "button", 0).show();
break;
29、通过GridView的滑动监听,来控制翻页按钮的状态:
private class GridViewScrollListener implements OnScrollListener{
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
@Override
public void onScroll(AbsListView view, //报告滚动状态的视图
int firstVisibleItem,//第一个可见item的索引
int visibleItemCount,//可见item的数量
int totalItemCount)//项目列表中的适配器的数量
{
if (firstVisibleItem==0) {
View view2 = gridView.getChildAt(firstVisibleItem);
if (view2!=null) {
Log.i("TAG","view2.getY()"+view2.getY());
if (view2.getY() == 8) {//在顶部
button_up.setBackgroundResource(R.drawable.upb);//向上的键为灰色
button_up.setClickable(false);//且不能按
} else {
button_up.setBackgroundResource(R.drawable.upg);//向上的键为白色
button_up.setClickable(true);//能按
}
}
}else{
button_up.setBackgroundResource(R.drawable.upg);//向上的键为白色
button_up.setClickable(true);//能按
}if ((firstVisibleItem+visibleItemCount)==totalItemCount) {
View view3 = gridView.getChildAt(totalItemCount-1-firstVisibleItem);//scrollview所占的高度
if (view3!=null) {
Log.i("TAG","view3.getY()"+view3.getY());
if (view3.getY() == 246) {//在底部
button_down.setBackgroundResource(R.drawable.downb);
//向下的键为灰色
button_down.setClickable(false);
//且不能按
} else {
button_down.setBackgroundResource(R.drawable.downg);
//向下的键为白色
button_down.setClickable(true);
//能按
}
}
}else{//在中部
button_down.setBackgroundResource(R.drawable.downg);
//向下的键为白色
button_down.setClickable(true);
//能按
}
}
}
30、代码实现一个帧动画:
if(image != null)
{
image.setBackgroundResource(image_addr[number]);
number++;
if(number > 10) number = 0;
}
31、Math.round的取值:
小数点后第一位=5
正数:Math.round(11.5)=12
负数:Math.round(-11.5)=-11
小数点后第一位<5
正数:Math.round(11.46)=11
负数:Math.round(-11.46)=-11
小数点后第一位>5
正数:Math.round(11.68)=12
负数:Math.round(-11.68)=-12
2016/3/23 星期三 上午 8:03:49
32、ViewPager加载步骤以及滑动监听Demo:
一、<android.support.v4.view.ViewPager 这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
二、LayoutInflater lf = getLayoutInflater().from(this);
view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);
viewList = new ArrayList<View>();// 将要分页显示的View装入数组中 private ArrayList<View> viewList;//把需要滑动的页卡添加到这个list中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
三、PagerAdapter pagerAdapter = new PagerAdapter() {
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getCount() {
return viewList.size();//返回页卡的数量
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {//删除页卡
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {//这个方法用来实例化页卡
container.addView(viewList.get(position));//添加页卡
return viewList.get(position);
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
};
四、viewPager.setOnPageChangeListener(new MyOnPageChangeListener());//获取viewpager的滑动监听
public class MyOnPageChangeListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
Log.i("TAG", "arg0="+arg0);
}
}
2016/3/24 星期四 下午 7:11:54
33、操作说明:
框架:ViewPager+GridView
一、左右滑动页面可以实现“功能介绍”“外观及功能简介”“安全事项”三个分页面的自由切换;
二、点击“功能介绍”“外观及功能简介”“安全事项”三个标题栏按钮可实现对应界面的切换,选中变换按钮布局背景;
三、左右滑动切换页面时,可以动态改变对应页面的标题背景,选择为蓝色,否则为灰色;
四、主页面滚动条隐藏、分页面滚动条为蓝色;
五、设置默认选择标题为功能介绍;
六、设置快捷启动GPS、蓝牙电话按钮,点击变换背景;
七、“功能介绍”页面放置4x3可滚动网格布局按钮图标;
八、点击“功能介绍”页面中的不同图标按钮,可以打开对应的页面,点击图标按钮变换背景;
九、隐藏页面滑动到边缘会出现的蓝色阴影;
十、除”功能介绍“外,共14个功能详解页面,页面可以上下滚动;
十一、程序右侧放置可控制所有页面滚动的按钮,按钮可以分向上/向下控制当前页面,滚动按钮点击变换颜色;
十二、进入页面默认向上滚动按钮为灰色,且不能点击;
十三、当页面离开顶端的时候,向上滚动按钮变色为可点击的白色;
十四、当页面滑动到底部时候,向下滚动按钮变色为灰色不可点击;
十五、当跳转/滑动至单屏页面时,右侧滚动按钮布局隐藏,否则显示;
十六、当通过主页点击按钮进入对应界面时,功能介绍标题栏会切换为当前打开页面标题,返回时,恢复功能介绍标题;
2016/3/26 星期六 下午 4:16:45
34、Relativelayout布局设置点击事件
设置Relativelayout的几个属性
clickable=“true”
focusable=“true”
再设置onclicklistener
2016/3/28 星期一 上午 8:06:34
35、实现View重叠覆盖:
Android写布局的机制也是从上往下变读变写,在RelativeLayout中,可以先写被覆盖的布局,然后再写覆盖的布局,这样就可以实现后写的布局覆盖先写的布局!
2016/3/29 星期二 上午 8:06:34
36、切记命令调试adb卸载应用的之前,一定要先adb remount,不然容易出现INSTALL_FAILED_UPDATE_INCOMPATIBLE错误!
2016/3/30 星期三 下午 5:05:08
37、textview
只显示一行,超过自动隔断:
android:ellipsize="end"
android:singleLine="true"