Android Tips

1、scroll

Scroller可以提供一种计算位移坐标的方法,scroller.startScroll(),然后

if (mScroller.computeScrollOffset()) {
			float x = mScroller.getCurrX();
			float y = mScroller.getCurrY();
			
		}

可以得到新的坐标点。

scrollTo和scrollBy都是view中的方法,用于view视图的移动。scrollTo是绝对位移,而scrollBy是相对位移。


2、Jni使用的一些知识

使用javah得到的头文件对c和c++来说都是适用的,因为在该头文件中有下面的声明

#ifdef __cplusplus
extern "C" {
#endif

extern “C”是C++语言为了支持与C语言的混合编程而制定的一个策略,该用法使得在C++语言中也可以有全局的函数或变量,因此生成的头文件即可以在c文件中使用,也可以在C++文件中使用,只不过在C++中变为全局的函数而已。

JNIEXPORT、JNICALL是java中对JNI定义的宏,在NDK中可以忽略。

3、java取整

floor——向负无穷取整;ceil——向正无穷取整;round——四舍五入,具体算法为floor(X+0.5);

4、android中Serializable和Parcelable的区别(转)

在android中利用intent传递的数据是有限的,只能传递基本数据类型、String和实现了Serializable和Parcelable接口的数据类。

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。
一 序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。 

二 至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。

实现:
1 Serializable 的实现,只需要继承  implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

2 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

android Parcelable化的提供了一个接口 Parcelable和一个工具类 Parcel
Parcelable:一个规范接口,定义实现Parcelable需要实现的功能
Parcel:数据存取的工具类,供用户在实现Parcelable接口时存取自定义数据用,也供系统传递数据时使用。
例子:

public class Book implements Parcelable {  
    private String bookName;  
    private String author;  
    private int publishTime;  
      
    public String getBookName() {  
        return bookName;  
    }  
    public void setBookName(String bookName) {  
        this.bookName = bookName;  
    }  
    public String getAuthor() {  
        return author;  
    }  
    public void setAuthor(String author) {  
        this.author = author;  
    }  
    public int getPublishTime() {  
        return publishTime;  
    }  
    public void setPublishTime(int publishTime) {  
        this.publishTime = publishTime;  
    }  
      
    public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {  
        public Book createFromParcel(Parcel source) {  
            Book mBook = new Book();  
            mBook.bookName = source.readString();  
            mBook.author = source.readString();  
            mBook.publishTime = source.readInt();  
            return mBook;  
        }  
        public Book[] newArray(int size) {  
            return new Book[size];  
        }  
    };  
      
    public int describeContents() {  
        return 0;  
    }  
    public void writeToParcel(Parcel parcel, int flags) {  
        parcel.writeString(bookName);  
        parcel.writeString(author);  
        parcel.writeInt(publishTime);  
    }  
}  

5、Android中Context的理解

 在Android中Context是一个随处都会见到的类,因为Context定义了应用程序的基础信息与操作。下面是关于Context的一些信息:

1、Context是一个抽象类,其中定义了一些应用程序的基本操作和信息;ContextImpl是Context的实现类,具体实现了那些基本操作。

2、ContextWrapper是继承自Context类,简单地对Context进行了一层包装,之后Activity、Service都继承自该类,这也就是为什么我们在使用的过程中可以把Activity.this、Service.this当作Context的原因。

3、使用Context我们可以获得一些应用级别的操作,如startActivity、startService、getSharePreference等。

总体来说Context描述的是一个应用程序的应用场景。

6、Activity加载模式

Activity的加载模式可以通过manifest指定,也可以在intent中设置flag指定,intent的flag会覆盖manifest的设置,manifest中可以设置为standard、singleTop、singleTask和singleInstance;Intent中设置FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP, FLAG_CLEAR_TOP。

1、stantard,标准模式,也是系统默认的加载模式,当他接收到一个intent消息时就创建一个Activity实例,比如现在存在的Activity为A-B-C-D,D在最上面,如果D中有个按钮再次startActivity(D),那么就会变为A-B-C-D-D;

2、singleTop,这种模式是当一个Activity在栈的最上层时再次启动这个Activity的话就不会再创建这个Activitiy的实例了,只调用该activity的onNewIntent()方法。比如现在有A-B-C-D,D再次启动D的话还是A-B-C-D,与standard是不同的。但该模式只针对最上层的Activity,如果刚才D启动的是C,那么现在的栈为A-B-C-D-C;

3、singleTask,系统在一个新task中实例化这个activity,如果在另一个task中已经存在activity的实例,那直接启动这个activity(onNewInstance),不再创建;

4、singleInstance,这种模式会新开一个栈,把启动的activity放进去,而且这个新的栈只会保留这一个Activity。例如现在是A-B-C-D,D启动B,就会变为A-B-C-D,B;如果B再启动E就会变为A-B-C-D-E,B。

1、FLAG_ACTIVITY_NEW_TASK,行为和singleTask一样;
2、FLAG_ACTIVITY_SINGLE_TOP,行为和singleTop一样;
3、FLAG_ACTIVITY_CLEAR_TOP,如果当前task已经有activity的实例,则清除它上面的所有activity,再调用onNewIntent。

7、Graphics中的camera

在Android框架中动画的变换使用camera会产生三维的效果。camera可以沿x/y/z轴三个方向移动,对应的效果如下:
1、沿z轴正向移动,效果:缩小图片,反之为放大图片;
2、沿y轴移动,效果:图片上下移;
3、沿x轴移动,效果:图片左右移;

8、自定义Dialog取消边缘阴影
自定义dialog的时候,在dialog的上边缘会有一条阴影,如果dialog背景是白色或透明就会产生不好的效果,取消的话只需要在style.theme中添加一条:
                       <item name="android:windowContentOverlay">@null</item>

9、更新SDK的同时更新ADT

否则会发生奇怪的错误,比如NoClassFound

10、Avoid weight

LinearLayout的layout_weight会使子view进行多次mearsure操作,使用RelativeLayout来优化,具体做法是

设置参考点,用align来拉伸子view:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <View 
        android:id="@+id/center_point"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_centerInParent="true"
        />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/center_point"
        />
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@id/center_point"
        />

</RelativeLayout></span>

11、RelativeLayout alignWithParentIfMissing="true"

也是拉伸的一种方式,达到LinearLayout的layout_weight效果

<span style="font-size:14px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />

    <TextView  
        android:id="@+id/secondLine"
        android:layout_width="fill_parent"
        android:layout_height="26dip" 
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/secondLine"
        android:layout_alignWithParentIfMissing="true"
        android:gravity="center_vertical"
        android:text="My Application" />

</RelativeLayout></span>

参考链接:http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

12、Animation——fillBefore、fillAfter、fillEnable

fillBefore,startAnimation时是否将View显示为动画的起始状态,主要针对包含startOffset的动画,默认值为true。

举个例子:对view作alpha动画,当前view的alpha是0.5,动画alpha从0到1变化,startOffset为1000,当view.startAnimation的时候,等待1000ms才会看到alpha的变化从0到1,fillBefore为true时,startAnimation时就会将view的alpha变为0,而不是等到1000ms之后才变为0;

fillAfter,动画结束后是否将View显示为动画的结束状态,默认为false;

fillEnable,控制fillBefore,当fillEnable为true时,fillBefore才会起作用;否则fillEnable为false时,忽略fillBefore的值,始终当作fillBefore=true来处理。默认为false

参考链接  http://graphics-geek.blogspot.com/2011/08/mysterious-behavior-of-fillbefore.html

13、Animation里的initalize

用于将动画设定里的相对值转换到真实值,比如TranslateAnimation里就可以设置偏移量相对parent还是对self,这里设置的是一个比例值,initalize方法会传入自己的宽高和父控件的宽高,使用resolveSize()转换。




你可能感兴趣的:(Android Tips)