亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS設置QQ小紅點消除的方法(一鍵退朝)

2020-07-26 03:28:49
字體:
來源:轉載
供稿:網友

QQ上黏黏的小紅點很好玩有木有,于是自己也想實現一番,看到iOS實現的人比較少,Android的比較多,于是這個就用iOS來實現哈~

效果圖:

這里寫圖片描述 

調試圖:

這里寫圖片描述

其實從實現來講,我是先實現第二張圖的效果的。

武林網小編給大家說下實現思路

1.了解原理,以及如何繪制“黏黏”形狀(即繪制兩圓加兩條貝塞爾曲線)。

2.新建UIView(AZMetaBallCanvas),作為單獨畫布用來繪制“黏黏”形狀,用程序實現算法,并繪制出來。

3.給畫布(AZMetaBallCanvas)添加attach:(UIView *)方法,并添加手勢監聽,重繪,使得任意 view 都能夠被在畫布上擁有“黏黏”效果。

4.根據連心線的距離加上判斷是否要斷開,用戶手指離開時也要根據距離來判斷是爆炸動畫還是回彈動畫。

詳細過程

首先必須要了解小紅點拖拽的過程形狀是什么,其實就是類似元球效果(MetaBall)。仔細觀察可分析發現,就是兩個大小不一樣的圓加上兩條貝塞爾曲線構成的。

這里寫圖片描述

關于算法部分,我已經分解成了另外一篇博文,強烈建議不清楚該形狀是怎么畫出來的同學先看一下《【算法分析】QQ“一鍵退朝”之詳細計算方法》

1.繪制拖拽

既然怎么求坐標點畫出來我們已經知道了,現在就可以去實現了。

首先新建一個“畫布”,繼承自UIView

//AZMetaBallCanvas.h@interface AZMetaBallCanvas : UIView@property(nonatomic,strong) Circle *centerCircle;@property(nonatomic,strong) Circle *touchCircle;@end

Circle為自定義實體類,里面定義了一些圓的基本屬性,如圓心坐標、半徑等。

為什么要新建一個畫布?

因為小紅點是能夠全屏拖動的,別看QQ上它存在某一行Cell,但其實你可以把它拉到別的Cell上去,這就需要給小紅點足夠的位置來繪制,就干脆新建一個畫布專門用來繪制小紅點的動作好了。

AZMetaBallCanvas目前包含兩個屬性,兩個圓,一個中心圓,一個觸摸圓,按照需求來看,中心圓應該是位置不變的,觸摸圓會跟隨手指觸摸屏幕的位置而改變,后面需要在兩個圓之間畫上貝塞爾曲線來構成元球效果。

接下來開始寫AZMetaBallCanvas的實現

//AZMetaBallCanvas.m#define RADIUS 40.0@interface AZMetaBallCanvas() {UIBezierPath *_path;CGPoint _touchPoint;}@end@implementation AZMetaBallCanvas- (instancetype)initWithCoder:(NSCoder *)aDecoder {self = [super initWithCoder:aDecoder];NSLog(@"initWithCorder");if (self) {[self initData];}return self;}- (void)initData {_touchCircle = [Circle initWithcenterPoint:self.center radius:RADIUS];_centerCircle = [Circle initWithcenterPoint:self.center radius:RADIUS];_touchPoint = self.center;NSLog(@"self.center (%f, %f)", self.center.x, self.center.y);}@end

先初始化兩個圓的位置,默認在View的中心,并在init、initWithFrame、initWithCoder等父類構造函數中加入自定義初始化方法initData。

重寫繪制方法

如同Android中的onDraw(),iOS中的drawRect能夠被重寫繪制,然后調用[view setNeedsDisplay]來通知重繪。

- (void)drawRect:(CGRect)rect {_path = [[UIBezierPath alloc] init];[self drawCenterCircle];[self drawTouchCircle:_touchPoint];[self drawBezierCurveWithCircle1:_centerCircle Circle2:_touchCircle];}

如同算法分析中所講,在繪制的時候,我們只需要繪制兩個圓(drawCenterCircle、drawTouchCircle)和連接兩圓的貝塞爾曲線(drawBezierCurve),算法其實就是照抄《【算法分析】QQ“一鍵退朝”之詳細計算方法》

iOS自帶貝塞爾曲線UIBezierPath,其自帶畫圓方法addArcWithCenter: radius: startAngle: endAngle: clockwise:,所以我們只要調用就好啦!

#pragma mark draw circle --- 畫圓- (void) drawCenterCircle {[self drawCircle:_path circle:_centerCircle];}- (void) drawTouchCircle:(CGPoint)center {_touchCircle.centerPoint = center;[self drawCircle:_path circle:_touchCircle];}- (void)drawCircle:(UIBezierPath *)path circle:(Circle *)circle {[_path addArcWithCenter:circle.centerPoint radius:circle.radius startAngle:0 endAngle:360 clockwise:true];[_path fill];[_path stroke];[_path removeAllPoints];}#pragma mark draw curve --- 畫貝塞爾曲線- (void)drawBezierCurveWithCircle1:(Circle *)circle1 Circle2:(Circle *)circle2 {float circle1_x = circle1.centerPoint.x;float circle1_y = circle1.centerPoint.y;float circle2_x = circle2.centerPoint.x;float circle2_y = circle2.centerPoint.y;//連心線的長度float d = sqrt(powf(circle1_x - circle2_x, 2) + powf(circle1_y - circle2_y, 2));//連心線x軸的夾角float angle1 = atan((circle2_y - circle1_y) / (circle1_x - circle2_x));//連心線和公切線的夾角float angle2 = asin((circle1.radius - circle2.radius) / d);//切點到圓心和x軸的夾角float angle3 = M_PI_2 - angle1 - angle2;float angle4 = M_PI_2 - angle1 + angle2;float offset1_X = cos(angle3) * circle1.radius;float offset1_Y = sin(angle3) * circle1.radius;float offset2_X = cos(angle3) * circle2.radius;float offset2_Y = sin(angle3) * circle2.radius;float offset3_X = cos(angle4) * circle1.radius;float offset3_Y = sin(angle4) * circle1.radius;float offset4_X = cos(angle4) * circle2.radius;float offset4_Y = sin(angle4) * circle2.radius;float p1_x = circle1_x - offset1_X;float p1_y = circle1_y - offset1_Y;float p2_x = circle2_x - offset2_X;float p2_y = circle2_y - offset2_Y;float p3_x = circle1_x + offset3_X;float p3_y = circle1_y + offset3_Y;float p4_x = circle2_x + offset4_X;float p4_y = circle2_y + offset4_Y;CGPoint p1 = CGPointMake(p1_x, p1_y);CGPoint p2 = CGPointMake(p2_x, p2_y);CGPoint p3 = CGPointMake(p3_x, p3_y);CGPoint p4 = CGPointMake(p4_x, p4_y);CGPoint p1_center_p4 = CGPointMake((p1_x + p4_x) / 2, (p1_y + p4_y) / 2);CGPoint p2_center_p3 = CGPointMake((p2_x + p3_x) / 2, (p2_y + p3_y) / 2);[self drawBezierCurveStartAt:p1 EndAt:p2 controlPoint:p2_center_p3];[self drawLineStartAt:p2 EndAt:p4];[self drawBezierCurveStartAt:p4 EndAt:p3 controlPoint:p1_center_p4];[self drawLineStartAt:p3 EndAt:p1];[_path moveToPoint:p1];[_path closePath];[_path stroke];}

2.監聽手勢

簡單版

最簡單的其實就是直接在AZMetaBallCanvas中重寫touchXXX等一系列方法,然后在其中調用setNeedsDisplay通知UIView重繪。

#pragma mark touch event- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {UITouch *touch = [touches anyObject];_touchPoint = [touch locationInView:self];[self setNeedsDisplay];}- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {UITouch *touch = [touches anyObject];_touchPoint = [touch locationInView:self];[self setNeedsDisplay];}

現在其實差不多第二張圖的效果已經出來了,差的就是更改兩圓的半徑方法。

這里寫圖片描述

改變半徑的方法就非常簡單了

#pragma 改變半徑-(void)changeCenterCircleRadiusTo:(float)radius {_centerCircle.radius = radius;[self setNeedsDisplay];}-(void)changeTouchCircleRadiusTo:(float)radius {_touchCircle.radius = radius;[self setNeedsDisplay];}

普通版

根據現象發現,我們需要通過拖拽小紅點來移動它,而不是我們手指點哪,小紅點就在哪,所以我們需要給小紅點增加手勢監聽,而不是“畫布”。

于是我們改為在畫布添加方法- (void)attach:(UIView *)item;,然后再給傳入的view添加Pan手勢。

- (void)attach:(UIView *)item {UIPanGestureRecognizer *drag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(drag:)];item.userInteractionEnabled = YES;[item addGestureRecognizer:drag];}- (void)drag:(UIPanGestureRecognizer *)recognizer {//得到觸摸點_touchPoint = [recognizer locationInView:self];//得到觸摸的viewUIView *touchView = recognizer.view;switch (recognizer.state) {case UIGestureRecognizerStateBegan:{//touch開始:在畫布上繪制一個touchView的副本//...此部分參看源碼break;}case UIGestureRecognizerStateChanged:{//移動中:記錄觸摸位置,更改touchView和touchCircle的坐標位置[self resetTouchCenter:_touchPoint];break;}case UIGestureRecognizerStateEnded: {//touch結束:根據連心線長度判斷是執行爆炸動畫還是彈簧動畫//...此部分參看源碼break;}default:break;}[self setNeedsDisplay]; //重繪}

以上內容是小編給大家介紹的IOS設置QQ小紅點消除的方法(一鍵退朝),希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频观看| 欧美精品在线看| 欧美大片免费观看| 精品国产精品三级精品av网址| 欧美激情精品久久久久久免费印度| 日韩在线国产精品| 91在线免费视频| 欧美香蕉大胸在线视频观看| xvideos国产精品| 国产91精品视频在线观看| 国产999在线观看| 国产精品久久久久不卡| 91av在线国产| 久久久久久中文字幕| 国产精品男人爽免费视频1| 中文综合在线观看| 在线性视频日韩欧美| 亚洲欧美中文日韩v在线观看| 色yeye香蕉凹凸一区二区av| 久久久久久久久久久久久久久久久久av| 欧美性20hd另类| 精品视频一区在线视频| 色综合久综合久久综合久鬼88| 成人日韩av在线| 久久久精品网站| 精品亚洲一区二区三区在线播放| 国产婷婷色综合av蜜臀av| 亚洲精品av在线| 久久精品视频va| 欧美激情视频一区二区三区不卡| 久久婷婷国产麻豆91天堂| 国外色69视频在线观看| 亚洲精品综合久久中文字幕| 日韩综合视频在线观看| 久久精品国产亚洲7777| www国产精品视频| 正在播放欧美视频| 亚洲精品第一国产综合精品| 亚洲娇小xxxx欧美娇小| 日韩av中文字幕在线免费观看| 久久精品最新地址| 午夜精品国产精品大乳美女| 欧美午夜精品久久久久久人妖| 热99在线视频| 欧美最近摘花xxxx摘花| 亚洲缚视频在线观看| 久久免费在线观看| 国产精品啪视频| 日韩av中文字幕在线| 久久天天躁狠狠躁夜夜爽蜜月| 国产极品jizzhd欧美| 中文字幕一区二区精品| 欧美一区三区三区高中清蜜桃| 国产在线拍偷自揄拍精品| 2019中文字幕免费视频| 日韩乱码在线视频| 久久精品国产久精国产思思| 国产成人亚洲综合91精品| 国自产精品手机在线观看视频| 亚洲国产精品免费| 精品视频在线播放色网色视频| 国产999在线观看| 精品一区二区三区四区| 成人免费视频网址| 最近日韩中文字幕中文| 亚洲国产精品久久久久久| 亚洲欧美色婷婷| 亚洲男人第一网站| 色琪琪综合男人的天堂aⅴ视频| 国产精品久久久久久久久粉嫩av| 日韩中文字幕av| 欧美一级黑人aaaaaaa做受| 福利微拍一区二区| 亚洲成人动漫在线播放| 日本精品久久电影| 亚洲自拍欧美色图| 亚洲第一福利在线观看| 日韩欧美在线视频观看| 日本午夜在线亚洲.国产| 一区二区在线免费视频| 欧美一级电影在线| 日韩精品中文字幕在线| 欧美一区二区三区四区在线| 国产精品视频专区| 青青草99啪国产免费| 欧美精品videofree1080p| 51久久精品夜色国产麻豆| 国产欧美精品一区二区三区介绍| 日韩中文在线中文网在线观看| 萌白酱国产一区二区| 欧美放荡办公室videos4k| 久久精品免费播放| 亚洲欧美日韩国产精品| 日韩一区二区精品视频| 性欧美亚洲xxxx乳在线观看| 欧美在线观看日本一区| 青青草成人在线| 欧美极度另类性三渗透| 亚洲国产欧美一区二区三区久久| 欧美老少做受xxxx高潮| 久久久久久高潮国产精品视| 国产亚洲一区二区在线| 欧美在线视频在线播放完整版免费观看| 伊人男人综合视频网| 欧美中在线观看| 中文字幕亚洲一区| 日本久久久久久久久久久| 欧美视频在线观看 亚洲欧| 亚洲天堂2020| 久久欧美在线电影| 欧美日韩国内自拍| 久久精品这里热有精品| 欧美日韩在线视频首页| 欧美在线一区二区三区四| 91九色视频在线| 欧美激情乱人伦一区| 久久久久久免费精品| 国产精品96久久久久久又黄又硬| 色偷偷888欧美精品久久久| 色偷偷噜噜噜亚洲男人| 亚洲综合大片69999| 精品福利樱桃av导航| 色先锋久久影院av| 欧美成人中文字幕在线| 国产精品自拍视频| 久久男人资源视频| zzijzzij亚洲日本成熟少妇| 色妞久久福利网| 91免费综合在线| 欧美激情一区二区三级高清视频| 欧美高跟鞋交xxxxhd| 亚洲一区二区三区久久| 亚洲一二在线观看| 亚洲a∨日韩av高清在线观看| 91情侣偷在线精品国产| 中文字幕一区二区精品| 亚洲综合在线播放| 国产精品91一区| 97av在线视频| 国产精品美女主播在线观看纯欲| 久久免费在线观看| 国产欧美日韩精品在线观看| 欧美日韩亚洲国产一区| 91色琪琪电影亚洲精品久久| 欧美精品情趣视频| 亚洲成人在线视频播放| 国产成人综合亚洲| 26uuu日韩精品一区二区| 亚洲另类xxxx| 国模精品视频一区二区三区| 欧美一级成年大片在线观看| 国产亚洲精品一区二区| 日韩欧美国产视频| 欧美日韩亚洲91| 91久久久久久久一区二区| 欧美电影在线播放| 蜜臀久久99精品久久久无需会员| 亚洲free性xxxx护士hd| 国产精品无av码在线观看| 国产男人精品视频| 欧美在线一区二区三区四| 欧美在线一级视频| 亚洲自拍欧美另类| 亚洲国产毛片完整版|