原帖:
http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=42665&pid=259991&page=1&extra=#pid259991
如题,简单的实现了跑马灯效果,把Scroll.java放入android.view包下,XML使用如下:
<?xml version="1.0" encoding="utf-8"?>
<Scroll xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dip"
android:layout_height="wrap_content">
<!--注意:Scroll里的布局或者控件元素只能有一个可以用布局嵌套布局/控件来使用,当Scroll里的唯一元素的宽度超过Scroll效果最好,如果不超过没加处理,有兴趣可以自己加上-->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="放大镜流口水附近拉神经分裂卡上的经费里卡迪神经分裂空间爱上" />
</Scroll>
package android.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Bitmap.Config; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.widget.HorizontalScrollView; public class GroupScrollView extends HorizontalScrollView implements Runnable { private View inner; private Bitmap bitmap = null; private int x; private int width; private int pWidth; private int pHeight; /** * 滚动步长 */ private int step = 5; /** * 滚动间隔距离 */ private int space = 100; private int delay = 500; public GroupScrollView(Context context) { super(context); setBackgroundColor(android.R.color.transparent); } public GroupScrollView(Context context, AttributeSet attrs) { super(context, attrs); setBackgroundColor(android.R.color.transparent); } @Override protected void onFinishInflate() { if (getChildCount() == 1) { inner = getChildAt(0); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); handler.removeCallbacks(this); } @Override protected void onDraw(Canvas canvas) { if (getWidth() == 0) { android.view.ViewGroup.LayoutParams lp = getLayoutParams(); lp.width = pWidth; lp.height = pHeight; setLayoutParams(lp); } if (bitmap == null && inner != null) { width = inner.getMeasuredWidth(); bitmap = Bitmap.createBitmap(width, inner.getHeight(),Config.RGB_565); Canvas canvas1 = new Canvas(bitmap); inner.draw(canvas1); pWidth = getWidth(); pHeight = getHeight(); if (inner != null) { removeViewInLayout(inner); inner = null; } run(); } if (bitmap != null) { int nowX = x; nowX -= step; canvas.drawBitmap(bitmap, nowX, 0, null); if (nowX < 0) { canvas.drawBitmap(bitmap, width + nowX + space, 0, null); } if (nowX <= -width) { nowX = 0; } x = nowX; } super.onDraw(canvas); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; @Override public void run() { invalidate(); handler.postDelayed(this, delay); } }
布局main.xml:
<?xml version="1.0" encoding="utf-8"?> <GroupScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="1234567890abcdefghijklmnopqrstuvwxyz1234567890" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="abcdefghijklmnopqrstuvwxyz" android:layout_weight="1" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="1234567890" android:layout_weight="1" /> </LinearLayout> </LinearLayout> </GroupScrollView>
我对OC了解还不深,只知道一些最基础的东西,总结一下。
- NSInteger、NSUInteger、CGFloat
typedef long NSInteger;
typedef unsigned long NSInteger;
#else
typedef int NSInteger;
typedef unsigned int NSInteger;
#endif 也就是说当需要使用int类型的变量的时候,可以像写C的程序一样,用int,也可以用NSInteger,但更推荐使用NSInteger,因为这样就不用考虑设备是32位的还是64位的。
- BOOL
- NSNumber
[array addObject:3];//会编译错误 这样是会引发编译错误的,因为NSArray里面放的需要是一个类,但‘3’不是。这个时候需要用到NSNumber:
[array addObject:[NSNumber numberWithInt:3]];
- NSString、NSMutableString
NSString str =@"a string";//这也是错误的
NSString *str = @"a new string";//这是正确的 一个NSString变量赋值了之后不能改变其值(当然可以重新给它赋其他的值),当需要使用可变的字符串的时候可以使用NSMutableString。NSMutableString继承值NSString,额外提供了一些改变值的方法。比如:
[str appendString:@"hello "];//str = @"hello "
[str appendFormat:@"my number is:%d",1];//str = @"hello my number is 1"
- NSArray、NSMutableArray
//do something
}
- (void)addOvject:(id)object;
- (void)removeObject:(id)object;
- (void)removeAllObjects;
- (void)insertObject:(id)object atIndex:(unsigned)index;
- NSDictionary、NSMutableDictionary
//这里的代码不会执行,因为key3返回的是nil
}
- (void)addObject:(id)object forKey:(id)key;
- (void)removeObjectForKey:(id)key
- (void)removeAllObjects;
- NSDate
- nil
- id
tem = @"abc";
tem = [[myClass alloc]init];
- @selector
3.3.7 Cocoa数字类型
本节中的类型不是Objective-C语言的一部分。它们都定义于Cocoa框架中,但是,我们会看到它们经常在这里提及。从Mac OS X 10.5开始,Apple已经使用定义的类型替代了Cocoa框架中int和float的大多数出现,而定义的类型的长度取决于代码是编译为32位可执行程序还是64位可执行程序(参见附录C)。
NSInteger
NSInteger替代了Cocoa框架中大多数int的出现。它在32位环境中定义为int,在64位环境中定义为long(64位整数)。
NSUInteger
NSUInteger是NSInteger的无符号形式。它替代了Cocoa框架中的大多数unsigned的出现。在32位环境中,它是一个无符号的32位整数;在64位环境中,它是一个无符号的long(无符号的64位整数)。
CGFloat
CGFloat替代了float。当针对32位环境编译的时候,它是一个float(32位);当针对64位环境编译的时候,它是一个double(64位)。Foundation框架提供了一个定义的常量,CGFLOAT_IS_DOUBLE,如果需要通过编程知道CGFloat在当前的环境中是一个float还是一个double,使用下面的语句:
NSLog
NSLog是Foundation框架中定义的一个用于字符输出的函数。NSLog不是Objective-C语言自身的一部分,但是,这里介绍它,是因为它用于本书中的很多示例和练习中。
NSLog类似于printf,但是有如下一些区别:
NSLog写入控制台日志,也写入一个终端窗口。控制台日志是操作系统负责维护的一个消息日志。在OS X上,可以使用Console应用程序(/Applications/Utilities/ Console.app)来查看控制台日志。
NSLog的格式字符串是一个NSString直接量,而不是一个C字符串直接量。
NSLog在打印后自动换到一个新行。不需要在格式字符串末尾添加一个额外的\n。
NSLog使用一个额外的转换修饰符,%@,它接受一个Objective-C对象作为其参数。在转换中,NSLog调用参数对象的description方法。该description方法返回一个NSString,用以描述该对象。返回的NSString替代了输出中的%@,如下面的例子所示:
NSString的描述只是字符串本身。执行以上代码,将会产生如下的输出:
当创建自己的类时,可以覆盖description方法为自己的类提供定制的描述。
注意 如果使用带有%@描述符的格式字符串,但是,忘记了提供一个对应的对象参数,那么NSLog将尝试向位于对象参数所应该放置的地址的字节发送一条description消息。这通常会导致程序崩溃。
在一个发布的程序中,不应该使用NSLog语句(这么做会在客户的控制台日志中产生杂乱信息),但是,对于在学习和调试过程的简单输出来说,它很有用。
NSLog有一项功能可能很恼人,它在你要求其输出的内容前面加了一个长长的字符串信息,其中包括执行该语句的时间和日期(详细到毫秒)、可执行程序的名称,以及执行它的程序的进程id。如下的NSLog语句:
将产生如下的输出:
为了显示上的清晰,在本书后面的部分中,在显示NSLog的输出时,我们去除了额外的信息。
转自: http://book.51cto.com/art/201102/245615.htm