【笔记】阳春三月

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"
    

你可能感兴趣的:(【笔记】阳春三月)