2016-10-22 17:35:36 hyf97135 阅读数 1257

我是安卓一年新人,好像最近有那种突然入门了的感觉,觉得什么都可以做,什么都能做,什么都能做出来,做好,朋友说这是第一个门槛,我猜可能真的是,但是不管怎么样,这种感觉和手感一定要保留下来,所以漫无天日的开始写控件,觉得很有意思.就比如IOS的开关按钮.
IOS的开关按钮看起来很炫酷,我也仿了一个.先上图
关
开

个人觉得很容易实现的.一下是源码,不多解释了.

public class MainActivity extends Activity {

    private RelativeLayout rl1;
    private TextView tv1;
    private boolean fln;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rl1 = (RelativeLayout) findViewById(R.id.rl1);
        tv1 = (TextView) findViewById(R.id.tv1);
        fln = true;

        rl1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                if(fln){
                    //开启的动画
                    Animation translateAnimation=new TranslateAnimation(0, 40, 0, 0);
                    translateAnimation.setDuration(200);//设置动画持续时间为3秒
                    translateAnimation.setInterpolator(MainActivity.this, android.R.anim.accelerate_decelerate_interpolator);//设置动画插入器
                    translateAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)
                    tv1.startAnimation(translateAnimation);
                    rl1.setBackgroundResource(R.drawable.corner02);
                    fln = false;
                }else{
                    //关闭的动画
                    Animation translateAnimation=new TranslateAnimation(40, 0, 0, 0);
                    translateAnimation.setDuration(200);//设置动画持续时间为3秒
                    translateAnimation.setInterpolator(MainActivity.this, android.R.anim.accelerate_decelerate_interpolator);//设置动画插入器
                    translateAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)
                    tv1.startAnimation(translateAnimation);
                    rl1.setBackgroundResource(R.drawable.corner01);
                    fln = true;
                }
            }
        });

    }

}
xml文件
corner00
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <solid android:color="#ffffff"/>

    <stroke android:width="0.5dp"
        android:color="#dddddd"
        />

    <corners 
        android:topLeftRadius="13dp"
        android:topRightRadius="13dp"
        android:bottomLeftRadius="13dp"
        android:bottomRightRadius="13dp"
        />


</shape>

corner01
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <solid android:color="#ffffff"/>

    <stroke android:width="1dp"
        android:color="#dfdfdf"
        />

    <corners 
        android:topLeftRadius="15dp"
        android:topRightRadius="15dp"
        android:bottomLeftRadius="15dp"
        android:bottomRightRadius="15dp"
        />


</shape>


corner02
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <solid android:color="#4bd663"/>

    <stroke android:width="0.5dp"
        android:color="#4bd663"
        />

    <corners 
        android:topLeftRadius="15dp"
        android:topRightRadius="15dp"
        android:bottomLeftRadius="15dp"
        android:bottomRightRadius="15dp"
        />


</shape>

真的没有什么好解释的,两个动画,用fln决定开关属性.
我是安卓1年新人,请指教.

2019-02-19 15:10:31 xiaopihair123 阅读数 127

垂直居中

textAlign: 'center',//只在Android上起作用
lineHeight:20,//iOS上要设置此属性

圆角

IOS不支持Text设置borderRadius属性,必须用view包裹,设置view圆角

2015-10-12 10:47:42 mydo 阅读数 2244

因为iOS设备的垂直同步总是开启的所以显得帧计数意义没啥意义.

帧计数给你一个多个帧中的平均数,现实中,你帧速率只能是60,30,20,15,12以及6fps等各个常数中的一个.所有这些值都是60的因子.

由于垂直同步被开启,如果一个帧未能在0.0166秒中在它的更新和渲染循环(update-and-render cycle)中完成,则该帧将显示在最近的另一个0.0166秒中,而不是一直渲染.

所以一旦游戏开始耗费超过0.0166秒去完成每一个帧,帧速率将降至30fps.

对于一些游戏帧速率剧烈在30至60fps之间波动,如果将其锁定在30fps就会很有意义.这会感觉到比帧率不断起伏而跳过成堆的帧(因此降至30fps然后在60fps渲染少量更多的帧)更加平滑,

为了改变最大帧速率,你可以在AppDelegate.m的startScene方法添加如下代码:

CGFloat framesPerSecond = 30;
[CCDirector sharedDirector].animationInterval = 1.0/framesPerSecond;

除以framesPerSecond是有必要的,因为animationInterval值被表示为seconds per frame.

2017-03-16 18:06:17 y550918116j 阅读数 1496

1 性能对比

2 介绍与使用

2.1 OSSpinLock

OSSpinLock 目前已不再安全,主要原因发生在低优先级线程拿到锁时,高优先级线程进入忙等(busy-wait)状态,消耗大量 CPU 时间,从而导致低优先级线程拿不到 CPU 时间,也就无法完成任务并释放锁。这种问题被称为优先级反转。

OSSpinLock theLock = OS_SPINLOCK_INIT;
OSSpinLockLock(&theLock);
OSSpinLockUnlock(&theLock);

2.2 dispatch_semaphore

dispatch_semaphore 是 GCD 用来同步的一种方式。允许通过 wait/signal 的信号事件控制并发执行的最大线程数,当最大线程数降级为1的时候则可当作同步锁使用。注意该信号量并不支持递归

dispatch_semaphore_t signal = dispatch_semaphore_create(1);
dispatch_semaphore_wait(signal, overTime);
dispatch_semaphore_signal(signal);

2.3 pthread_mutex

POSIX标准的unix多线程库(pthread)中使用的互斥量,支持 while 循环。

pthread_mutex_t lock
pthread_mutex_init(&lock, NULL);
pthread_mutex_lock(&lock);加锁
pthread_mutex_tylock(&lock); / pthread_mutex_trylock(&lock) == 0
pthread_mutex_unlock(&lock);
pthread_mutex_destroy(&lock);

2.4 NSLock

典型的面向对象的锁,即同步锁类。所有锁(包括NSLock)遵循 Objective-C 的 NSLocking 协议接口,支持 tryLock 和 lockBeforeDate: 。底层通过 pthread_mutex 实现。

NSLock *lock = [[NSLock alloc] init];

if ([lock tryLock]) { // 尝试加锁,如果失败返回NO,不会阻塞该线程
    [lock unlock];
}
if ([lock lockBeforeDate:date]) { // 在Date之前尝试加锁,如果不能加锁,则返回NO
    [lock unlock];
}

2.5 NSCondition

NSCondition基于信号量方式实现的锁对象,提供单独的信号量管理接口。底层通过pthread_cond_t实现。

NSCondition *condition = [[NSCondition alloc] init];
[condition lock];
[condition wait];   // 让当前线程处于等待状态
[condition signal]; // CPU发信号告诉线程不用在等待,可以继续执行
[condition unlock];

2.6 pthread_mutex(recursive)

pthread_mutex的递归锁实现,作用和NSRecursiveLock类似,主要为了防止在递归的情况下出现死锁。

pthread_mutex_t lock;

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&lock, &attr);
pthread_mutexattr_destroy(&attr);

pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);

pthread_mutex_destroy(&lock);

2.7 NSRecursiveLock递归锁

NSRecursiveLock 和 NSLock 一样是面向对象的锁,但是支持递归,不支持tryLock。这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或递归操作中。

NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];

void RecursiveFunction(int value) {
    [theLock lock];
    if (value != 0) {
        --value;
        RecursiveFunction(value);
    }
    [theLock unlock];
}

RecursiveFunction(5);

2.8 NSConditionLock条件锁

NSConditionLock 可以使用特定值来加锁和解锁。相比NSCondition更为直接和实用。

id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
while(true) {
    [condLock lock];
    /* Add data to the queue. */
    [condLock unlockWithCondition:HAS_DATA];
}

2.9 @synchronized

通过 @synchronized 可以非常方便的创建一个互斥锁非常方便的方法。@synchronized 通过对象的哈希表来实现。

- (void)myMethod:(id)anObj {
    @synchronized(anObj) {

    }
}

3 结论

  1. 常规和 while 循环加锁使用 pthread_mutex。
  2. 队列(dispatch_get_global_queue)并发线程数控制,使用 dispatch_semaphore。
  3. 递归调用时使用 NSRecursiveLock(项目中不建议使用此方案,风险高)。
  4. 性能要求极度苛刻时,考虑使用 OSSpinLock,不过需要确保加锁片段的耗时足够小。
  5. 不建议使用 NSLock、pthread_mutex(recursive)、NSCondition、NSConditionLock 和 @synchronized。

其实除了上面9种锁,我们还可以通过串行队列实现同步锁。不过那种感觉就像拿着火炮打蚊子,打的准不准不说,其打的速度堪忧。

 


Appendix

不再安全的 OSSpinLock

深入理解 iOS 开发中的锁

起底多线程同步锁(iOS)

[iOS] 正确使用多线程同步锁 @synchronized()

Revision History

时间 描述
2017-03-16 博文完成

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974

2014-01-11 14:37:37 u011872945 阅读数 1346

上一讲介绍了iOS中的异步请求,这讲来看看IOS同步请求。

1、IOS网络请求,同步GET请求,代码如下:

 //请求地址
    NSString *urlString=@"http://192.168.18.66/webios/login.aspx?username=zhangsan&pwd=321654";
    
    NSURL *url=[NSURL URLWithString:urlString];
    //初始化请求
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
    //发送数据,返回结果
    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //解析成字符串
    NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
    NSLog(@"result:%@",str);

2、IOS网络请求,同步POST请求,代码如下:

//请求地址
    NSString *urlString=@"http://192.168.18.66/webios/login.aspx";
    NSURL *url=[NSURL URLWithString:urlString];
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    
    //设置请求方式
    request.HTTPMethod=@"POST";
    
    NSString *params=@"username=zhangsan&pwd=321654";
    
    NSData *data=[params dataUsingEncoding:NSUTF8StringEncoding];
    //设置请求内容
    request.HTTPBody=data;
    //发送请求,返回结果
    NSData *received=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    
    NSString *result=[[NSString alloc] initWithData:received encoding:NSUTF8StringEncoding];
    
    NSLog(@"result:%@",result);




Css 仿iOS的开关按钮

阅读数 2956

用Css仿iOS的开关按钮,微信风格

博文 来自: voidmain_123

iOS之同步锁

阅读数 960

iOS推送开关

阅读数 618

iOS实现同步请求

阅读数 147

没有更多推荐了,返回首页