1.android:clipToPadding属性的分析
clipToPadding属性定义了是否允许ViewGroup在padding中绘制,该值默认为true,即不允许.
* 所以若我们给ListView设置了android:paddingTop="70dip" android:paddingBottom="70dip"
* 那么我们可以看到ListView的头部以上和尾部以下都占有70大小的padding,在滑动ListView的过程
* 中这个padding当然是存在的.在padding部分是看不到ListView的item的,本质上是在这两部分没有绘制
* 我们的ListView
* 假若我们此时为ListView设置属性android:clipToPadding="false",同样再滑动ListView此时可以
* 发现在ListView的头部以上和尾部以下都占有70大小的padding部分依然可以显示我们的ListView的
* item,本质上是在这两部分绘制了我们的ListView
*
* 该属性很适合的应用场景:
* 设置ListView的第一个(最后一个)Item距离屏幕TOP(BOTTOM)有一段距离的情况
2. android:scrollbarStyle属性的分析
insideInset、insideOverlay、outsideInset、outsideOverlay属性
3.CardView 属性
android.support.v7.widget.CardView
complie ‘com.android.support:cardview-v7:23.1.0’
CardView继承至FrameLayout类,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影。CardView是一个Layout,可以布局其他View。
CardView常用属性:
card_view:cardElevation 阴影的大小
card_view:cardMaxElevation 阴影最大高度
card_view:cardBackgroundColor 卡片的背景色
card_view:cardCornerRadius 卡片的圆角大小
card_view:contentPadding 卡片内容于边距的间隔
card_view:contentPaddingBottom
- card_view:contentPaddingTop
- card_view:contentPaddingLeft
- card_view:contentPaddingRight
- card_view:contentPaddingStart
- card_view:contentPaddingEnd
card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式
card_view:cardPreventConrerOverlap 在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠
4.Android5.0新增的两个XML属性elevation和translationZ 属性
android5.0 引入了Z轴的概念,于是就有着这种风格,也就是目前比较火的Material Design。
- android:elevation 设置该组件“浮”起来的高度,通过设置该属性可以让该组件呈现3D效果。
- android:translationZ 设置该组件在Z方向(垂直屏幕方向)上的位移。
对应的Java方法:setElevation(float) setTranslationZ(float)
5. 设置text的外观 android:textAppearance ,Button 设置button的style
android:textAppearance=”@style/TextAppearance.AppCompat.Button”
style=”?android:borderlessButtonStyle” 没有边框的按钮
如“android:textAppearance=“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,
?表示系统是否有这种外观,否则使用默认的外观。
可设置的值如下:
textAppearanceButton/
textAppearanceInverse/
textAppearanceLarge/
textAppearanceLargeInverse/
textAppearanceMedium/
textAppearanceSmallInverse/
textAppearanceMediumInverse/
textAppearanceSmall/
6.Android系统中设置TextView的行间距(非行高)android:lineSpacingExtra android:lineSpacingMultiplier
1、android:lineSpacingExtra
设置行间距,如”3dp”。
2、android:lineSpacingMultiplier
设置行间距的倍数,如”1.2″。
7..android 的系统架构(上-下)
1.Application (应用)
2.Application Framework(应用程序框架层) 系统自带的API Activity、Package、ResouseManager 。。
3.Libraries(系统运行库c/c++库), Sqlite,OpenGL,webkit
4.Linux kernel(Linux内核)硬件驱动:音频,照相机,蓝牙,WiFi驱动等
8.Android studio的使用:
Android studio使用教程系列:http://segmentfault.com/a/1190000002411926#articleHeader1
Android studio使用教程快捷键使用:http://segmentfault.com/a/1190000002418983
Android studio使用教程Gradle使用:http://segmentfault.com/a/1190000002439306
Android studio模拟器 配置:http://www.tuicool.com/articles/6RJ3mqJ
9.引用第三方
第三方类库jar包
这就简单多了,直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖。如下:
dependencies {
compile ‘com.android.support:support-v4:19.1.0’
compile files(‘libs/libammsdk.jar’)
compile files(‘libs/universal-image-loader-1.8.6-with-sources.jar’)
compile files(‘libs/YoumiSdk_v5.00_2015-01-08.jar’)
}
第三方so库
通常来说,我们调用第三方的so库是不需要额外工作的,只需将其放入指定目录,然后在java文件中load即可。
比如我引用之前《第一个NDK程序》中编译出的libFirstLib.so,将其放到app/src/main/jniLibs/armeabi/下,在源码中引用:
static {
System.loadLibrary(“FirstLib”);
}
第三方类库源码
import medule 进去之后再project setting 里面导入library即可,或者直接在build.gradle里面配置也行:
参考:http://www.open-open.com/lib/view/open1415793464648.html Android studio gradle配置
10.消除“Permission is only granted to system apps”错误
在AndroidManifest.xml中使用了如下的配置:
就会报错:Permission is only granted to system apps
原因如下:
此类权限仅授予系统级应用,可以修改下Link Error Checking项的安全级别;
In Eclipse: Window -> Preferences -> Android -> Lint Error Checking
在ID列表中,找到ID = ProtectedPermission,设置Serverity低于Error,比如Warning级别就好了。
11.android 强大的Intent(意图)
给Intent带上附加值Ertra:
Intent i = new Intent(CSM_listView.this,ImageViewer.class);
i.putExtra("icon",data.icon);
startActivity(i);
接收方可以接收查看附加数据:
int icon = getIntent().getIntExtra("icon",0);
也可以分两步,方便查询多个附加数据:
Bundle bundle = getIntent().getExtras();
boolean willContinue = bundle.getBoolean("continueGame",false);
int icon = bundle.getInt ("icon",0);
发Intent启动Activity并获取返回值
i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(Intent intent, int requestCode);
并定义对返回值的处理函数
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK ){ //操作没错误
Bundle extras = data.getExtras();
bmp = (Bitmap)extras.get("data");//关键词是“data”
viewPhoto.setImageBitmap(bmp);
}
}
12.全屏加无状态栏:
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
13.灰色的小提示框 Toast
Toast toast = Toast.makeText(this,”不知阁下尊姓大名?”,Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER,0,0);//设置显示的位置
toast.show();
14.Preference使用
如果要查找Preference中的控件(如,CheckBoxPreference,EditTextPreference等)用以下方法:
PreferenceManager manager = getPreferenceManager();
CheckBoxPreference password = (EditTextPreference) manager.findPreference(“password”);
获取Preference中的值使用:
PreferenceManager.getDefaultSharedPreferences(context).getString(“user”,”“);
或者分两步,方便查询同一个Preference中的多个值
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean willMusic = sharedPreferences.getBoolean(“music”,true);
String username = sharedPreferences. getString(“user”,”“);
15.android软件盘的使用:
Android中软键盘的使用是非常多的,下面为软键盘常用的设置;
1、横屏时,点击输入框出现全键盘解决方案: 在EditText、searchview等控件中加
android:imeOptions=”flagNoExtractUi”
2、竖屏时,安卓会出现半屏。
case1:你的输入框处于中下的位置,这样的话,键盘可能挡住输入框。 解决方法:在manifest中对activity设置
android:windowSoftInputMode=”adjustResize”
这样activity的主窗口总会resize为键盘提供空间
case2:你的输入框处于偏上面,一般情况下这样就不会有什么问题,但是如果你的界面纵向方面使用的是layout_weight即比重来分布页面的话,
软件盘会压缩整个window,导致输入框部分被压缩。 解决方法:在manifest中对activity设置
android:windowSoftInputMode=”adjustPan”
这样键盘不会对压缩原窗口,只会遮盖下面一部分内容。这样输入框不会被压缩了。
3、刚进入一个activity,会focus 输入框,这时会主动弹出软键盘,如果不希望自动弹出,那么可先让其他的不重要的控件获取焦点,然后一个定时器
再让EditText获取焦点即可!
4、判断软键盘当前是否处于弹出状态
if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
5、手动隐藏软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
6、手动弹出软键盘
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
16.通用的xml和json解析
1.T通用xml数据解析
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
2.T通用json数据解析
详细请看:http://blog.csdn.net/lyx2007825/article/details/7900675
17.HTTPUrlConnection post请求
private static final int TIMEOUT_IN_MILLIONS = 10 * 1000; // 超时时间
public static String doPost(String url, Map<String,Object> params) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection) realUrl
.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "utf-8");
conn.setUseCaches(false);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
if (params != null && !params.toString().equals("")) {
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(params);
// flush输出流的缓冲
out.flush();
}
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
// JSONObject json = new JSONObject(result.toString());
//
// bool = json.getBoolean("bool");
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
18.android动画
android动画一种是帧动画(Frame Animation),一种是补间动画(Tween Animation)。帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样。补间动画可以实现View组件的移动、放大、缩小以及渐变等效果。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/app_loading0"
android:duration="150"/>
<item
android:drawable="@drawable/app_loading1"
android:duration="150"/>
</animation-list>
animation-list 是动画列表,中间放很多的item 也就是组成帧动画的图片,
android:drawable[drawable]//加载Drawable对象
android:duration[long]//每一帧动画的持续时间(单位ms)
android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行
19.ListView的属性
android:cacheColorHint=”#00000000” //设置拖动背景色为透明
android:dividerHeight="30px" //listview item之间的高度
android:divider="@drawable/ic_launcher" //listview item之间的背景或者说是颜色
android:fadingEdge="vertical" //上边和下边有黑色的阴影 值为none的话就没有阴影
android:scrollbars="horizontal|none" //只有值为horizontal|vertical的时候,才会显示滚动条,并且会自动影藏和显示
android:fastScrollEnabled="true" //快速滚动效果,配置这个属性,在快速滚动的时候旁边会出现一个小方块的快速滚动效果,自动隐藏和显示,
android:scrollbarStyle="outsideInset" //四个值的含义如下
1>outsideInset : 该ScrollBar显示在视图(view)的边缘,增加了view的padding. 如果可能的话,该ScrollBar仅仅覆盖这个view的背景.
2>outsideOverlay : 该ScrollBar显示在视图(view)的边缘,不增加view的padding,该ScrollBar将被半透明覆盖
3>insideInset :该ScrollBar显示在padding区域里面,增加了控件的padding区域,该ScrollBar不会和视图的内容重叠.
android:fastScrollEnabled=”false”
25
4>insideOverlay : 该ScrollBar显示在内容区域里面,不会增加了控件的padding区域,该ScrollBar以半透明的样式覆盖在视图(view)的内容上.
首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false
android:stackFromBottom=”true”
第二是 transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。 android:transcriptMode=”alwaysScroll”
第三cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性android:background=”@drawable/bg”,不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。
如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了
第四divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线
android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider=”@drawable/@null” 就可以了
第五fadingEdge属性,上边和下边有黑色的阴影
android:fadingEdge=”none” 设置后没有阴影了~
第六scrollbars属性,作用是隐藏listView的滚动条,
android:scrollbars=”none”与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏
第七fadeScrollbars属性,android:fadeScrollbars=”true” 配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。
20.adb常用命令
adb install 软件位置,安装软件
adb uninstall 包名:卸载模拟器的软件
adb push 保存
adb pull
1、简介:
ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备。
常用命令:
1)显示系统中全部Android平台: list targets
2)显示系统中全部AVD(模拟器):android list avd
3)创建AVD(模拟器):android create avd –name 名称 –target 平台编号
4)启动模拟器:emulator -avd 名称 -sdcard ~/名称.img (-skin 1280x800)
5)删除AVD(模拟器):android delete avd –name 名称
6)创建SDCard:mksdcard 1024M ~/名称.img
7)AVD(模拟器)所在位置:
Linux(~/.android/avd)
Windows(C:\Documents and Settings\Administrator.android\avd)
8)启动DDMS:ddms
9)显示当前运行的全部模拟器:adb devices
10)对某一模拟器执行命令:adb -s 模拟器编号 命令
11)安装应用程序:adb install -r 应用程序.apk
12)获取模拟器中的文件:adb pull
13)向模拟器中写文件:adb push
14)进入模拟器的shell模式:adb shell
15)启动SDK,文档,实例下载管理器:adb android
16)缷载apk包:adb uninstall apk包的主包名
17)查看adb命令帮助信息:adb help
18)在命令行中查看LOG信息:adb logcat -s 标签名
21.Application的作用
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作
(一).传递数据:
假如有一个Activity A, 跳转到 Activity B ,并需要推荐一些数据,通常的作法是Intent.putExtra() 让Intent携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。但这样作有一个问题在 于,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable或者Parcellable接口。这其实是Android的一种IPC数据传递的方法。如果我们的两个Activity在同一个 进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。
基本思路是这样的。在Application中创建一个HashMap
22.自定义xml属性
一、在res/values文件下定义一个attrs.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ToolBar">
<attr name="buttonNum" format="integer"/>
<attr name="itemBackground" format="reference|color"/>
</declare-styleable>
</resources>
二、在布局xml中如下使用该属性:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<cn.zzm.toolbar.ToolBar android:id="@+id/gridview_toolbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/control_bar"
android:gravity="center"
toolbar:buttonNum="5"
toolbar:itemBackground="@drawable/control_bar_item_bg"/>
</RelativeLayout>
三、在自定义组件中,可以如下获得xml中定义的值:
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);
buttonNum = a.getInt(R.styleable.ToolBar_buttonNum, 5);
itemBg = a.getResourceId(R.styleable.ToolBar_itemBackground, -1);
a.recycle();
就这么简单的三步,即可完成对自定义属性的使用。
首先来看看attrs.xml文件。
该文件是定义属性名和格式的地方,需要用
<declare-styleable name="ToolBar"></declare-styleable>
包围所有属性。其中name为该属性集的名字,主要用途是标识该属性集。那在什么地方会用到呢?主要是在第三步。看到没?在获取某属性标识时,用到”R.styleable.ToolBar_buttonNum”,很显然,他在每个属性前面都加了”ToolBar_”。
在来看看各种属性都有些什么类型吧:string , integer , dimension , reference , color , enum.
前面几种的声明方式都是一致的,例如:。
只有enum是不同的,用法举例:
<attr name="testEnum">
<enum name="fill_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
</attr>
如果该属性可同时传两种不同的属性,则可以用“|”分割开即可。
让我们再来看看布局xml中需要注意的事项。
首先得声明一下:xmlns:toolbar=http://schemas.android.com/apk/res/cn.zzm.toolbar
注意,“toolbar”可以换成其他的任何名字,后面的url地址必须最后一部分必须用上自定义组件的包名。自定义属性了,在属性名前加上“toolbar”即可。
最后来看看java代码中的注意事项。
在自定义组件的构造函数中,用
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);
来获得对属性集的引用,然后就可以用“a”的各种方法来获取相应的属性值了。这里需要注意的是,如果使用的方法和获取值的类型不对的话,则会返回默认值。因此,如果一个属性是带两个及以上不用类型的属性,需要做多次判断,知道读取完毕后才能判断应该赋予何值。当然,在取完值的时候别忘了回收资源哦!
23.解决应用点击home退出程序的bug:
在activity的ocreate()方法添加super.onCreate(savedInstanceState);
if(!this.isTaskRoot()) { //判断该Activity是不是任务空间的源Activity,“非”也就是说是被系统重新实例化出来
//如果你就放在launcher Activity中话,这里可以直接return了
Intent mainIntent=getIntent();
String action=mainIntent.getAction();
if(mainIntent.hasCategory(Intent.CATEGORY_LAUNCHER) && action.equals(Intent.ACTION_MAIN)) {
finish();
return;//finish()之后该活动会继续执行后面的代码,你可以logCat验证,加return避免可能的exception
}
}
24.判断当前是平板还是手机:
public boolean isTable(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
25.android style 和theme
Android上的Style分为了两个方面:
1.Theme是针对窗体级别的,改变窗体样式;
2.Style是针对窗体元素级别的,改变指定控件或者Layout的
@color/white
true
@drawable/back (更改返回按钮的图标比如ToolBar)
@style/Daily.DrawerArrowStyle
false
true
@drawable/back
@color/ab_background_light
@color/black
自定义Dialog的Style:
<style name="Loading_Dialog" parent="@android:style/Theme.Dialog">
<item name="android:backgroundDimAmount">0.6</item> <!-- 灰度 -->
<item name="android:windowBackground">@android:color/transparent</item> <!-- 背景透明 -->
<item name="android:windowFrame">@null</item><!-- 没有边框 -->
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowIsFloating">true</item><!-- 是否悬浮在activity上 -->
<item name="android:windowIsTranslucent">true</item><!-- 半透明 -->
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->
<item name="android:windowContentOverlay">@null</item><!-- 对话框是否有遮盖 --><item name="android:windowAnimationStyle">@style/dialog_animation</item><!-- 弹出或者进入时的动画效果 --><item name="android:colorBackgroundCacheHint">@null</item><!-- 背景缓存颜色 -->
</style>
26.shape用于设定形状,可以在selector,layout等里面使用,有6个子标签
<!-- 圆角 --><corners
android:radius="9dp"
android:topLeftRadius="2dp"
android:topRightRadius="2dp"
android:bottomLeftRadius="2dp"
android:bottomRightRadius="2dp"/><!-- 设置圆角半径 --><!-- 渐变 --><gradient
android:startColor="@android:color/white"
android:centerColor="@android:color/black"
android:endColor="@android:color/black"
android:useLevel="true"
android:angle="45"
android:type="radial"
android:centerX="0"
android:centerY="0"
android:gradientRadius="90"/><!-- 间隔 --><padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp"/><!-- 各方向的间隔 --><!-- 大小 --><size
android:width="50dp"
android:height="50dp"/><!-- 宽度和高度 --><!-- 填充 --><solid
android:color="@android:color/white"/><!-- 填充的颜色 --><!-- 描边 --><stroke
android:width="2dp"
android:color="@android:color/black"
android:dashWidth="1dp"
android:dashGap="2dp"/>
27.ImageView.scaleType的几个属性
SetScaleType(ImageView.ScaleType.CENTER);
按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示SetScaleType(ImageView.ScaleType.CENTER_CROP);
按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)setScaleType(ImageView.ScaleType.CENTER_INSIDE);
将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
setScaleType(ImageView.ScaleType.FIT_CENTER);
把图片按比例扩大/缩小到View的宽度,居中显示
FIT_START, FIT_END在图片缩放效果上与FIT_CENTER一样,只是显示的位置不同,FIT_START是置于顶部,FIT_CENTER居中,FIT_END置于底部。
在此就不给出示例了。FIT_XY
不按比例缩放图片,目标是把图片塞满整个View。
28.File 类读写文件 :
如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中
进行权限的配置:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
[java] view plaincopy在CODE上查看代码片派生到我的代码片
在对SD卡进行读写的时候会用到的知识点:
Environment类的静态方法:
* getDataDirectory(); 获取android中的data目录;
* getExternalStorgeDirectory(); 获取到外部存储的目录一般指SD卡;
* getDownloadCacheDirectory(); 获取到下载的缓存目录;
* getExternalStorageState(); 获取外部设置的当前状态,sd卡
Android 中外部存储的状态情况如下,我们比较常用的应该是 MEDIA_MOUNTED(sd卡存在并且可以进行读写):
* MEDIA_MOUNTED sd卡中可以进行读写;
* MEDIA_MOUNTED_READ_ONLY sd卡 存在,只可以进行读的操作
Android 对于外部存储的状态判断:
* getRootDirectory(); 获取到 Android Root 路径;
* isExternalStorageEmulated(); 判断外部存储是否有效;
* isExternalStorageRemovable(); 判断外部存储是否可以移除;
29.drawable 不同文件夹
每种切图都需要下面表格中的展示的三种规格
像素密度 | 系数 | Logo分辨率 |
---|---|---|
hdpi | 1.5 | 72 * 72 |
xhdpi | 2.0 | 96 * 96 |
xxhdpi | 3.0 | 144 * 144 |
30.socket中TCP的三次握手建立连接详解
我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:
客户端向服务器发送一个SYN J
服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
客户端再想服务器发一个确认ACK K+1
只有就完了三次握手当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
31.socket中TCP的四次握手释放连接详解
上面介绍了socket中TCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过程,
过程如下:
1.某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
2.另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
3.一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
4.接收到这个FIN的源发送端TCP对它进行确认。
32.Android动画举例解析–XML
[html] view plaincopy
<pre name="code" class="html"> <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"
/>
<!-- 透明度控制动画效果 alpha
浮点型值:
fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度
说明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
长整型值:
duration 属性为动画持续时间
说明:
时间以毫秒为单位
-->
</set>
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator=
"@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
</set>
<!-- 尺寸伸缩动画效果 scale
属性:interpolator 指定一个动画的插入器
在我试验过程中,使用android.res.anim中的资源时候发现
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
浮点型值:
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
布尔型值:
fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
-->
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="30"
android:toXDelta="-80"
android:fromYDelta="30"
android:toYDelta="300"
android:duration="2000"
/>
<!-- translate 位置转移动画效果
整型值:
fromXDelta 属性为动画起始时 X坐标上的位置
toXDelta 属性为动画结束时 X坐标上的位置
fromYDelta 属性为动画起始时 Y坐标上的位置
toYDelta 属性为动画结束时 Y坐标上的位置
注意:
没有指定fromXType toXType fromYType toYType 时候,
默认是以自己为相对参照物
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
-->
</set>
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="+350"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000" />
<!-- rotate 旋转动画效果
属性:interpolator 指定一个动画的插入器
在我试验过程中,使用android.res.anim中的资源时候发现
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
浮点数型值:
fromDegrees 属性为动画起始时物件的角度
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
说明:
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明: 以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
-->
</set>
XML中的动画效果
[html] view plaincopy
public static Animation loadAnimation (Context context, int id)
//第一个参数Context为程序的上下文
//第二个参数id为动画XML文件的引用
//例子:
myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);
//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
在Java代码中定义动画
[java] view plaincopy
//在代码中定义 动画实例对象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
//根据各自的构造方法来初始化一个实例对象
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
33.
What is Application
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。
总结:
1.Application是android系统的一个组件,唯一个Application类(单例模式)
2.Application的生命周期是整个程序的生命周期
3.Application的作用 数据传递 数据共享 数据缓存 等
34.android的优点和缺点:
1、开源,有强大的软件开发者支持
2、无缝结合的Google应用。
3、对网络友好,丰富的功能选择。对比苹果对Flash的完全抵制……
4、软件兼容性好。
缺点:1.存在安全和隐私问题 2.运营商仍然能够影响到Android手机 3、分依赖开发商缺少标准配置 4、首先开卖Android手机的不是最大运营商
35.intent的作用:
Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
36.什么事ANR,如何避免:
ANR的定义:
在android上,如果你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
避免: 如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。
37.assets什么含义?与res的区别:
*res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
*res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
38.请介绍下Android的数据存储方式
Android 提供了5种方式存储数据:
–使用SharedPreferences存储数据;
–文件存储数据;
–SQLite数据库存储数据;
–使用ContentProvider存储数据;
–网络存储数据;
39. 防止手机进入休眠状态
PowerManager.WakeLock wl;
wl = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK,”whatever”);
wl.acquire();//启动休眠锁
wl.release();//释放休眠锁
40.WebView调用JS方法
做混合应用的时候webview 添加JavascriptInterface 后 js掉用方法 出现undefined 调试了一下午终于找到原因:
在绑定的方法前一定要加
@JavascriptInterface
否则在某些手机(比如红米)的webview中会出现调用方法时undefined的情况
41.android 使背景平铺(repeat):
方法1: 系统api实现
复制代码代码如下:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
//bitmap = Bitmap.createBitmap(100, 20, Config.ARGB_8888);
BitmapDrawable drawable = new BitmapDrawable(bitmap);
drawable.setTileModeXY(TileMode.REPEAT , TileMode.REPEAT );
drawable.setDither(true);
view.setBackgroundDrawable(drawable);
方法2: XML实现
xml路径:res/drawable/bg.xml
复制代码代码如下:
42.传感器基础
传感器的种类:
- 动作传感器
加速度传感器、重力传感器和陀螺仪(判断手机姿态)等 - 位置传感器
方向传感器和磁力传感器 - 环境传感器
温度传感器 、压力传感器和亮度传感器
使用传感器的方法:
1. 获取SensorManager对象
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
2. 执行SensorManager对象的getDefaultSensor()方法获取Sensor对象并且传入一个特定的参数
3. 获取Sensor对象的各种属性
4. 使用SensorManager 的对象注册传感器,sensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate);
第三个参数是获取的频率: SENSOR_DELAY_NORMAL(200000微妙) SENSOR_DELAY_UI(60000微妙) SENSOR_DELAY_GAME(20000微妙) SENSOR_DELAY_FASTEST(0微秒) 使用原则:尽量使用比较低的传感器采样率。这样系统的消耗较少,同时可以省电
电子罗盘:
1. /* 取得SensorManager */
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
/* 取得需要的Sensor,并注册SensorEventListener */
mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_NORMAL);/实现监听器,并重写其中的方法/
private final SensorEventListener mSensorEventListener = new SensorEventListener()
{
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
public void onSensorChanged(SensorEvent event) {
/* 判断Sensor的种类 */
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
/* 取得X值资料- x_data是水平值
- 由于分成8个方向,所以每个方向为45°
- */
float x_data = event.values[SensorManager.DATA_X];
//北方为337.5°至22.5°
if ((x_data > 0 && x_data <= 22.5) || x_data > 337.5) {
TextView01.setText(“北方” + String.valueOf(x_data)); }
//东北方为22.5°至67.5°
else if (x_data > 22.5 && x_data <= 67.5) {
TextView01.setText(“东北方” + String.valueOf(x_data)); }
//东方为67.5°至112.5°
else if (x_data > 67.5 && x_data <= 112.5) {
TextView01.setText(“东方” + String.valueOf(x_data)); }
//东南方为112.5°至157.5°
else if (x_data > 112.5 && x_data <= 157.5) {
TextView01.setText(“东南方” + String.valueOf(x_data)); }
//南方为157.5°至202.5°
else if (x_data > 157.5 && x_data <= 202.5) {
TextView01.setText(“南方” + String.valueOf(x_data)); }
//西南方为202.5°至247.5°
else if (x_data > 202.5 && x_data <= 247.5) {
TextView01.setText(“西南方” + String.valueOf(x_data)); }
//西方为247.5°至292.5°
else if (x_data > 247.5 && x_data <= 292.5) {
TextView01.setText(“西方” + String.valueOf(x_data)); }
//西北方为292.5°至337.5°
else if (x_data > 292.5 && x_data <= 337.5) {
TextView01.setText(“西北方” + String.valueOf(x_data)); } } } };
43.launchMode基础
我们今天要讲的是Activity的四种launchMode。
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。
Activity一共有以下四种launchMode:
1.standard
2.singleTop
3.singleTask
4.singleInstance
我们可以在AndroidManifest.xml配置的android:launchMode属性为以上四种之一即可。
下面我们结合实例一一介绍这四种lanchMode:
1.standard
standard模式是默认的启动模式,不用为配置android:launchMode属性即可,当然也可以指定值为standard。
2.singleTop
我们在上面的基础上为指定属性android:launchMode=”singleTop”,系统就会按照singleTop启动模式处理跳转行为。
44.IntentServices 和Services
IntentServices
利用这个方法无需手动控制线程的执行顺序
如果是一个后台任务,交给Service去执行,因为Service中也不能执行耗时操作,所以还是需要开启子线程开执行,使用这个方法就可以忽略这个问题
当任务执行完毕后会自动关闭服务
从Activity中发送Intent之后就可以丢给后台去处理,就算当前的Activity被finish掉也不会影响任务的执行