|
- require "import") w0 m1 j% h3 C; L. D* a
- import "android.app.*"" |4 E0 }* V; Z1 P) Z* R, u
- import "android.os.*"
2 e* c( {3 q0 A5 V2 l7 _+ K - import "android.widget.*"$ g% P" S0 u+ E
- import "android.view.*"' Q2 i9 U' R' y! c& i) z
- ( ?! c2 _0 y6 D! Z; _
- activity.setTitle('自绘制气泡拖动条'); \# R: Z$ U0 W
- activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题+ t, k0 Q. ]) ^- t' x9 W
4 m0 c" M2 H+ O- W: X4 M5 B6 C7 ~- activity.setContentView(loadlayout({
- g+ Q+ \2 O4 ~1 z" | - ScrollView;
/ G$ m+ [" W; @, d! ~ - layout_height="fill";5 V J1 Q$ |! ?* X5 w y! k4 @
- layout_width="fill";
( T% |& l0 c* Q1 y - {% u' {+ O" U7 h
- LinearLayout;
& C5 x% H/ s: R3 l - layout_width="fill";
! e! X& e+ q: }( W0 a - gravity="top";
, Q3 c' b+ ~' m: C- m6 F - layout_height="fill";$ D# P1 D& O* W8 F0 L' d% A
- orientation="vertical";" u/ Z! \9 H; f }6 P1 R! J
- {: |- C9 o( n- y3 q5 R
- TextView;5 V- {3 Y) R9 g) @: `5 j
- layout_width="fill";$ I( N! M) a3 Y* d; D0 Z2 O0 L
- padding="15dp";; B; Z5 I! n t2 E0 f/ e( _
- id="t1";* M, y4 I7 A+ \0 K' `$ n3 d( ]
- };1 [( E# H$ h3 W$ N
- {# R Y# |+ z5 l, w( T9 @6 c
- View;
) @; ^. n/ L: p - layout_width="fill";
) r1 p7 t; n V& X" Y+ U - layout_height="35dp"; `. b6 d% o0 s5 \, N R
- id="animseekBar";
" a3 l2 W, I' i9 X - };/ W& E/ E; j _' b
- {% R) @% H1 ?! l
- TextView;4 l( D( p) u7 W, \% U$ k0 a5 R- S* w, `
- layout_width="fill";: Q8 `/ l$ l2 }: b
- padding="15dp";
3 I! O/ W/ p. m; S8 L - id="t2";2 @( B6 N/ R9 P) Y7 X
- };4 i2 c# O! S, a0 F1 g. c, S
- };6 J) E6 {1 M7 m- H" K
- }
! v$ m# ]2 a3 E* O - ))2 P8 C: l, b7 y# m
- ' h1 d% B. F4 n4 s0 K [
- import "android.graphics.*"
4 |6 M! S" H+ L$ k5 B4 _ - import "android.graphics.Paint$Style"
# ?1 C: P$ J( A* k) K3 e - import "android.view.animation.*"! `5 { c/ T$ ]9 Q6 a+ A [
- import "android.animation.ObjectAnimator"
/ a5 P: a& z& X& s- U - import "android.animation.PropertyValuesHolder"
) G! ~+ `) x' h
: c" u& B' }' b1 S, \# m- dip2px=function(dpValue): H$ p; I/ X( u
- local scale = activity.getResources().getDisplayMetrics().density;
# f* Z4 B4 v7 D/ @, m6 _/ B5 b8 I - return dpValue * scale + 0.5' t) P, G9 d4 `/ C1 x; b
- end/ d: s& u1 h6 J9 L) T9 ]
- ! B0 p0 @* D2 n8 ~, ]
- sp2px=function(spValues)
; O1 K1 r) m4 U - local fontScale = activity.getResources().getDisplayMetrics().scaledDensity;
( l ~) X/ b8 z - return spValues * fontScale+ 0.5% o l) I5 `6 O5 U
- end
! C6 N! J. p" Q; U
6 a8 ^5 _, I3 u- q1 L- getStatusBarHeight=function()2 \7 j' g; _9 S6 U# M
- _,statusBarHeight2=xpcall(function()9 Y/ Y1 U: V" i3 L$ C
- local clazz=Class.forName("com.android.internal.R$dimen")
9 z/ i$ h' j' @' G0 H - local object = clazz.newInstance();
! `" B( u4 E* w" F - local height = Integer.parseInt(tostring(clazz.getField("status_bar_height").get(object))); s. h0 p4 c# E# l
- return this.getResources().getDimensionPixelSize(height);/ p* G+ d2 d. v' u) A* R! d+ J( r
- end,
: }/ W$ F9 a" l/ F5 X - 1 l. w9 W* j# s! k4 a$ T( q& K! b
- function(a)
9 e( T8 P( @9 y- V8 g$ L+ H1 } - _,statusBarHeight1=pcall(function()
' g) M( J# ]1 @! X$ d - local resourceId = this.getResources().getIdentifier("status_bar_height", "dimen", "android");, o; V Q9 m1 m% ]- S$ c
- if resourceId > 01 i; a* \+ O9 _" u6 Z( v
- return this.getResources().getDimensionPixelSize(resourceId);
5 j7 n: u8 z( K( J) T - end
: X6 Y% s8 W5 J, S+ L - end,/ G) A- B3 l: k+ \
- function(e)
* ~ x1 ~& K2 H' D - end,nil)$ T9 t3 v/ A( C3 p3 k: r
( R5 o& l/ @$ V# e- end,6 ~9 U$ m& Z$ f, S0 Y$ n7 A7 y' R% Y0 ?
- nil)1 } o: Q0 u3 a5 ]% Y. ~ A
- if type(statusBarHeight2):lower()=="number"% o2 [7 G6 x' _. A( {. ?/ X+ N
- return statusBarHeight2* n* D7 u# p6 p1 s5 R2 z
- elseif type(statusBarHeight1):lower()=="number"1 y6 W7 m7 E; ~, k
- return statusBarHeight1
7 X2 S% K ~( b! h4 u' A( f0 A% p - else
6 A$ n D) |0 x - return 02 h8 u b* V& R, x
- end6 i/ L6 w/ U4 p. g8 d N
- end
3 g. P) E& Z8 X0 ?) X4 o# S( F1 ]) g+ y
/ \$ D1 a3 X5 \- BgColor=0xFFBDBDBD--背景色, d; _, Z/ j# l4 J! f
- TopColor=0xFF9C27B0--进度条颜色. j/ j8 \; |/ s. t$ m3 Q. y/ _
- TopHandleColor=0xFF9C27B0--滑块颜色
* |4 ?& W3 C7 X7 j( a - BubblesColor=0xffffffff--气泡字体颜色
( {1 M* F. L/ D! S# c5 j4 m+ V - BgHeight=dip2px(3)--背景高度
! t) \% w& F6 p. g' c6 G - TopHeight=dip2px(4)--进度条高度! B- Z9 y! S6 B
- TopHandle=dip2px(8)--滑块半径: ]! e4 K& {8 W- V5 }; B& D& D
- Max=100--最大值
5 L% m4 [7 v: V5 m: p - Dragprogress=0--当前进度
' C9 q! t' g p# N - CanvasMargin=dip2px(48)--边距3 p: |, f% }/ Q. w2 r
- bubblesTextSize=sp2px(12)--气泡内文字大小# J+ n) f: H3 @, s
- Seekbarids=animseekBar( N% s' ]4 Z5 ~# W2 A
- : k/ {9 D0 X8 q9 E8 c
- import "android.content.Context"3 A7 [8 S N; |- n, T- A
- mWindowManager = activity.getSystemService(Context.WINDOW_SERVICE);; k- t1 D$ \; u
0 A( K' }+ q, ~) J* n' _6 c- IndicatorWindow=function(getH,getW)
, G2 } r7 \; M9 m! | - local mLayoutParams = WindowManager.LayoutParams();
4 `" q+ Q- n3 X5 y9 U. I - mLayoutParams.gravity = Gravity.START | Gravity.BOTTOM;0 G1 Q: P& ]+ H M) @5 B
- mLayoutParams.width =getW;
+ B% U) n! p) _4 v) A - mLayoutParams.height = getH;% Q5 W& m8 r$ @8 j: c
- mLayoutParams.format = PixelFormat.TRANSLUCENT;
3 v3 g' T' T" X - mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL% t) s8 B' H/ W2 P: n& p* R+ Y. {
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
: S+ Y# H8 Q( H - | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;1 V% Q7 U Z G5 u
- --MIUI禁止了开发者使用TYPE_TOAST,Android 7.1.1 对TYPE_TOAST的使用更严格; o3 f r- [, l8 W) b% y, l5 f
- if Build.MANUFACTURER:lower()~="xiaomi" or Build.VERSION.SDK_INT >= 252 }5 j5 O, w& w4 x. o: y0 v, m' l
- mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;$ t9 U8 A" @3 p6 k
- else
8 }/ Q0 B$ T" I% `0 E - mLayoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;; y& C, v6 a7 m p- a; R
- end: g! g; z% s: U! Z4 K; v
- return mLayoutParams
- k2 R( v' y5 z) V* e - end
% p5 D0 ?2 q# n% }: p
" x7 s/ R7 w. M5 M! M- 0 k! i+ S+ f5 S8 x
- ShowBubbles=function(ids)& s0 N: b* I8 n- @, j( w9 _6 ?, v/ @9 ^
- local mBubbleView=& w9 r5 x, A$ b( O
- {
* g z N4 m& Q. r6 N* E2 [% ~$ s- q - LinearLayout;* ?& F$ \" a9 \% {3 j- ~
- layout_width="fill";
" O- p$ V. y% M$ Y4 J4 D - layout_height="fill";
$ D& X5 g" T% m1 t - id="Mcft_Main",- {7 Q! d0 Z' d: v0 I/ z1 C
- {
; G" \1 X, o; G+ T; M/ D - View,
( z E# ~; S) j ]4 o - id=ids,
2 G; R4 [( ^9 i - layout_width="54dp";$ R8 K3 }0 Z9 r. R6 s: Z
- layout_height="55dp";1 p6 E2 E: c4 T& {
- Visibility=View.GONE,
0 `9 Z9 _3 v3 f9 V& s* a5 D7 L - }
/ @9 f" j) q0 j2 x - }
2 q* E5 X3 {. e, V/ y - mWindowManager.addView(loadlayout(mBubbleView), IndicatorWindow(0,0) );
/ Q. X& U4 K- @) U0 P - end: V+ O0 K7 L) g- _1 Q( t
9 F" ]) H6 i/ A, D- PaintBubbles=function(progess)
8 E& M. T) r# w9 \# [, j - newPaint=Paint(), d/ u Y* m5 |! L( y L( g
- newPaint.setTextSize(bubblesTextSize)" }: V+ C( g6 w* z5 a
- TextMin=newPaint.measureText(tostring(progess)), }& X+ ]. _( i2 |" L$ L* ^
- Indicator=sp2px(24)
! x8 d9 [# p& E2 r7 i - BubblesSize=bubblesTextSize+sp2px(3)+ v5 B# P# x+ s9 M6 k7 M+ c' P( I
- local Paintd=LuaDrawable(function(canvas,paint)
/ e& b' K- t7 [! W; y, K - local cW=canvas.Width
3 M: d' {* H4 J9 x" \6 r - local cH=canvas.Height$ S1 f5 R9 T- j9 o7 g- ~
- paint.setAntiAlias(true)
% n8 B8 J' T1 U" r6 J/ W, I; |) } - paint.setStyle(Style.FILL);8 t, e" D9 ]8 m3 F+ G
- 9 i2 w; n5 U3 ^* E% ~
- paint.setFakeBoldText(false)( ^1 @- _- I7 t" _
- paint.setTextSize(bubblesTextSize)! G. e$ l% T8 m4 u, I* p- z
- 9 B$ x: V, s, |& O+ c& i( R# z
- paint.setColor(TopHandleColor)3 m! a* ^3 t# B6 m
- local path =Path()
1 p# \# B# M4 c4 L9 s$ | - path.moveTo(Indicator/2,(cH/1.75))
& L. O/ h& ~& d) X7 `- x - path.lineTo(cW-(Indicator/2),cH/1.75)
4 f0 }/ g ~4 H/ C* d" E - path.lineTo(cW/2,cH)8 n. O! R# Z' b1 A6 n
- path.close()/ z \2 d% J6 E" U3 |
- canvas.drawPath(path, paint)
0 y* {7 h2 @1 e2 [4 b0 }- ]
5 K" ]! c/ R; U$ X0 u' t1 B- canvas.drawCircle(cW/2,cH/2,BubblesSize, paint);5 Q+ x! K. p& W+ i9 r& \& y4 ?
- / T, a! o4 e* Y8 C
- paint.setColor(BubblesColor)
, d) I: b9 V" y% k, H - canvas.drawText(tostring(progess),(cW/2)-(TextMin/2),(cH/2)+(bubblesTextSize/2.5),paint)
& C/ X+ A! |5 X" @' y - end)
! x+ v7 H. w! f i \8 p+ K' d - return {draw=Paintd,Circlesize=(BubblesSize*2)+Indicator}1 I* D; F- F" o v. I. P- A
- end
8 [& _2 ^- g6 [8 x
& [2 x Q$ @, c+ D9 N/ u6 X, L
% z" ^* S: q& m3 d- H+ S" E# d+ G1 d) |* [' Y
- locationUpdate=function(views,getX,getY,progess)
/ j9 N: K/ L |6 ]5 G! N$ q - local outRect1 = Rect();
1 J! q/ `) @+ V/ [" M2 h' A - activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
# z; o4 e( a( {$ r+ u - local WidowHeight=outRect1.height()6 h! }" }3 }; h. _& J3 S
- -Seekbarids.getParent().getHeight()
; n# T+ }2 F F: G3 y9 v - local clazz=Class.forName("com.android.internal.R$dimen"); I, i/ m- @$ U i0 S
- local object = clazz.newInstance();$ A; c) E6 H6 M6 Z4 ^" d1 f- [" L
- local height = Integer.parseInt(tostring(clazz.getField("status_bar_height").get(object)))
- _8 E7 X: c. E7 @8 u - local status_bar_height = this.getResources().getDimensionPixelSize(height);7 `" m4 c: U3 h: A6 @1 s; D
- % S( D9 p5 Q# }1 l; P5 t& C0 o
- local BuDraw=PaintBubbles(progess)
' l2 h, X6 M1 Q2 Y2 k. y - views.setBackground(BuDraw.draw)
& }& h- {1 Z9 a9 f8 T1 [) S - views.setX(getX+((CanvasMargin/2)-(views.getWidth()/2)))% Z6 |1 l& E( k# D
- views.setY((getY+status_bar_height)-(views.getHeight()/2))) a, C# G: ?9 f' j$ \' C
- --views.setImageDrawable(BuDraw.draw)3 p! }) s$ t v! T: T7 R
- local newParams=IndicatorWindow(outRect1.height(),Seekbarids.getParent().getWidth())$ }. r/ ^( U0 F m
- mWindowManager.updateViewLayout(views.getParent(), newParams);0 `' p& i& {& V( U
- ; _3 D: o, I! x/ I+ V
- end
( _- p- G8 d7 `- \ - 7 k$ S; V% l8 i% u4 n2 L
- LogoutBubble=function(view)8 o) G# Y8 Q; q0 @4 e
- mWindowManager.removeViewImmediate(view.getParent());
) y' h3 E5 |+ ]" L - end
# c, V, i8 v/ A8 o9 X0 r& V
/ {3 @6 G1 R9 v- $ ]( O" p- y# `4 F
- PropertyS=function(a,b,view,isType)
4 `/ c0 D7 v" G7 ^ - local Attribute_definition = PropertyValuesHolder.ofFloat("method",{ a,b}): W& h' U5 G! F" H4 N+ _
- local mValueAnimator = ObjectAnimator.ofPropertyValuesHolder({Attribute_definition})
" N) }$ I& w6 W0 H- p- e8 R% I - .setStartDelay(0)
/ C6 d8 H' ^- g- X# x5 G. r* P* [ - .setInterpolator(AnticipateOvershootInterpolator())- ?) ^, |/ X9 O0 a! B
- .setDuration(500)
# ~2 m# H9 E3 |4 p - mValueAnimator.addUpdateListener({
% v6 k/ ], `0 F3 S& |2 b - onAnimationUpdate=function(animation)( s: v/ s( g$ x* ?
- local Animationaprogress=animation.getAnimatedValue()+ F* ~; H" \1 c0 R5 ^
- if isType
4 k. f' S) ~2 q0 y - view.setVisibility(View.VISIBLE)( Q9 ~+ [/ u7 p4 s5 Y
- end
3 U0 p+ Y+ o' l3 p& E' R' v - view.setAlpha(Animationaprogress)
# ~& D- c7 |9 o3 k: K' G - view.setPivotY(view.getHeight()*1.4)
9 N( M; @1 m' E' S& U4 \$ Z - .setPivotX(view.getWidth()/2)' o3 U& |' @0 F7 ~. _7 q D4 ~- u
- .setScaleX(Animationaprogress)- E3 C. e# `' m0 H2 Z [1 V/ r
- .setScaleY(Animationaprogress)7 \) \4 ]3 c j ^0 Y* b
- --.setRotationX(-90+(Animationaprogress*90))$ Z4 e! a1 N3 ~8 L& U3 D1 t
- AnimFolatN=Animationaprogress8 e1 P9 E+ Y0 p& `4 y) M2 o7 M/ T
- SeekbarAmin.invalidateSelf()
3 O: [" a6 ^8 \: p - end,% g" Z& L4 @1 X1 n$ e
- });5 Y6 ^* I# ?1 o- w, D8 k
- mValueAnimator.addListener({+ T( z) S. l) n& h) S/ `
- onAnimationEnd=function()3 u9 v' |% a t. M
- if not isType
$ g- Y& K6 L) G1 _6 T; h( {7 T/ M - view.setVisibility(View.GONE)- V Y" \5 _$ B% G4 X+ ]: l
- LogoutBubble(view): C: Z6 a; L2 G; [) f
- end
3 H8 o( C$ ^' E3 \0 Z - end3 f, k }, s% u6 f' T' h
- }).start()4 m- i, {8 s$ G" i) H
- end" W3 y/ u6 t8 D5 i% U
7 `# T9 L; D$ O1 {$ g3 M
6 j- _: K& N/ F) u0 u$ o) w- --mBubbleView.setVisibility(GONE); --防闪烁3 d6 r$ [; \" n s! O* ^! O
$ D! X3 I7 ?* w# `+ @& k& k5 Z! K- --mLayoutParams.x = (mBubbleCenterRawX + 0.5f);
+ [; H# C$ h- e* t( T L - --mWindowManager.updateViewLayout(mBubbleView, mLayoutParams);! R0 E$ h7 p4 i& W m. N
3 ^! P) f( ], c& e" d- $ N. j/ X4 C& R: K) k2 x
- getWidthPercentage=function(w,max,proges)( `7 I& N' V% q; u8 Q
- local WidthDivision=(w/max)*proges* Q" @6 U( v5 X, N. ^( ]+ H3 Q
- return {TowX=WidthDivision,Proges=proges}; t+ L( K5 F$ r! Z0 D
- end: n5 u8 Q# E1 `3 H5 Y3 i" ]
- ; ~( T: s6 q2 `9 U' Z
- AnimFolatN=0
& ]3 h8 w/ ^0 Y' ]4 R - SeekbarAmin=LuaDrawable(function(canvas,piant,d)
9 r) L# w, E. k7 L - canvasWidth=canvas.getWidth()-CanvasMargin4 H1 v, p* I8 H
- canvasHeight=canvas.getHeight(). ?2 I' P( X# @6 d' N
- # J% C* n) @# }( K1 |. ~
- canvas.translate(CanvasMargin/2,0)! G2 u" W9 I- v6 L: \) K
- 2 X& R1 I# O: z; `7 s
- piant.setStrokeCap(Paint.Cap.ROUND)
$ Z. q6 J* v$ `' f' s0 C - piant.setAntiAlias(true). M% s* {) x& P# `* ^; z( W
- & e0 Q; ]( ?0 S4 V3 |
- --画背景进度条
& N& T1 n0 O; q% h5 G - piant.setColor(BgColor);
6 ]+ n3 U- L7 L3 f0 S1 K: X0 w2 x - piant.setStrokeWidth(BgHeight);9 T' Y6 I6 c1 X! ?" M
- canvas.drawLines({0,canvasHeight/2,canvasWidth,canvasHeight/2},piant)
3 B' M5 X; A9 u7 b4 f; A# B; q& c
/ B' e' S; c0 i9 e! y* t- --画顶部进度条5 Q1 i' R; |8 l p/ K1 U
- piant.setColor(TopColor);1 k. f6 m4 X# _4 P/ q( F
- piant.setStrokeWidth(TopHeight+((TopHeight/4)*AnimFolatN));
2 E0 h! O2 H ~ - canvas.drawLines({0,canvasHeight/2,getWidthPercentage(canvasWidth,Max,Dragprogress).TowX,canvasHeight/2},piant)
! ^8 P' w# X2 {5 o- G
8 U6 B' j7 Q0 q* s W! x- --画滑块
2 Z# r6 w, X# R) s - piant.setColor(0x23000000);
Z% ^5 a9 v" y* n4 e - canvas.drawCircle(getWidthPercentage(canvasWidth,Max,Dragprogress).TowX,canvasHeight/2,((TopHandle*1.7)*AnimFolatN), piant);8 \. r8 [2 t$ z1 X
- piant.setColor(TopHandleColor);
9 J) W5 Y4 p* X3 U- t - canvas.drawCircle(getWidthPercentage(canvasWidth,Max,Dragprogress).TowX,canvasHeight/2,TopHandle-((TopHandle)*AnimFolatN), piant);9 M5 _ ?$ S+ Q# }! U/ W
- end)9 E) Q* V7 l- e0 `& f! B3 }( e
- , m x$ V8 Y4 X
- Seekbarids.background=SeekbarAmin
) {1 a6 T. t: i" N+ C! h - D" C5 [0 J! G
- getPView=function(a)0 v- p: } {8 f
- a=a.getParent()
+ F9 e. d& H3 x& _' `5 f. O - while a~=nil and not tostring(a):find("ScrollView")
2 C- V2 Q V2 m" W, ^% Z0 V - a=a.getParent()
2 q4 m$ w' d7 }& f* \/ d4 s - end
5 B2 T3 S$ Z6 {0 r( K - return a==nil and 0 or a.getScrollY()- z# A/ `- P- [
- end
" x! K8 z9 t0 X3 _, x - : }' @' k% f0 D- @7 c, _: G
- Seekbarids.onTouch=function(v,event)
( G9 H2 S' t5 ]8 g' p - local Maction=event.getAction()- ?* f' Y, w& g: Q
- if Maction==MotionEvent.ACTION_DOWN
0 s9 j& h, \. D4 N$ A - if event.getX()>CanvasMargin/2 and event.getX()<v.getWidth()-CanvasMargin/2# q, `1 x! l8 [7 L' H# L
- and event.getY()>(v.getHeight()/2)-TopHandle and event.getY()<(v.getHeight()/2)+TopHandle
- E" j% x4 U# \; q3 ]+ Y( U: I - WithinRange=true
' i6 c" V' o% m0 P) |- _ ] - ShowBubbles("bubbles")
2 v( ^% i6 ]/ E- B3 P& [) W - PropertyS(0,1,bubbles,true)) h% K; G# o+ n) d- g* B6 o# W
- v.getParent().requestDisallowInterceptTouchEvent(true);
" r3 e7 w' j3 z0 O* }) i+ |- [) ] - else' d7 @8 [% m# n; ~
- WithinRange=false3 d7 P P$ ~! p2 l% v
- end
- D* A$ ^' M- c! n& `5 j$ X - elseif Maction==MotionEvent.ACTION_MOVE
$ Q. j6 @" ?, J& I: p( Z; r - if WithinRange' a2 d8 @% q. t2 L
- v.getParent().requestDisallowInterceptTouchEvent(true);0 B1 D+ }/ w. Y
- local getXTo=event.getX()
; K1 I0 n7 o% ?- d% t - local ranger=(event.getX()-CanvasMargin/2)/(v.getWidth()-CanvasMargin)
9 R( f' @/ e& ^. o9 H' e6 O3 N2 {: U - --计算百分比
`2 ?3 Z6 R# U) r - Dragprogress=tointeger((ranger<=0 and 0 or (ranger>=1 and 1 or ranger))*Max)8 X& K3 z: k, ]1 a
- locationUpdate(bubbles,getWidthPercentage(Seekbarids.getWidth()-CanvasMargin,Max,Dragprogress).TowX# u+ u- g0 ~! _
- ,Seekbarids.getY()-getPView(v),Dragprogress)
$ M, V0 e3 }/ s: U! `) [6 D6 c& J - SeekbarAmin.invalidateSelf()
|) `$ b( w* R* J& T# b: |( X - end
2 F5 L. X1 x& T) g. E+ o - elseif Maction==MotionEvent.ACTION_UP
+ \( r( S, V2 ~2 p - v.getParent().requestDisallowInterceptTouchEvent(false);
' E, O2 Z! X0 k3 t% t - pcall(function()
4 d; B3 W* L Y; H& X - if bubbles and WithinRange- D! a+ x/ v$ g5 o
- PropertyS(1,0,bubbles,false)
7 Q! i9 E3 x1 r& n. E) P% U! j* F$ b - end
! t1 K/ b8 h( V' Q* }( @ - end); \1 a7 L' \$ s1 a6 x x* o$ w7 [! T
- end
, S) P1 Z& ]; g8 I5 O) E) j - return true;
" N% D* x( Q# v* S- ]! A6 F/ z - end
, |: D$ }5 A- Z1 b1 r0 F
& s( D3 L5 X5 W- t1.text=[[+ x" c, I4 S- N
- Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。2 V9 i9 L. U+ f7 _
- ]]
9 v; W% S) L1 Z$ ~& ]: w8 v - t2.text=[[. {5 E; i3 \3 g: B( b, D
- 2003年10月,Andy Rubin等人创建Android公司,并组建Android团队。% L1 C* o" i( E" x/ _% ?# j
- 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队。安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。9 [2 u5 ?$ o( @6 z3 j$ h7 q
- 2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(Open Handset Alliance)来共同研发改良Android系统,这一联盟将支持谷歌发布的手机操作系统以及应用软件,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。[3] [4]" N0 A& J T x, G# a- e
- 2008年,在GoogleI/O大会上,谷歌提出了AndroidHAL架构图,在同年8月18号,Android获得了美国联邦通信委员会(FCC)的批准,在2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本。
4 {/ j0 v1 ]3 l7 ^% A - 2009年4月,谷歌正式推出了Android 1.5这款手机,从Android 1.5版本开始,谷歌开始将Android的版本以甜品的名字命名,Android 1.5命名为Cupcake(纸杯蛋糕)。该系统与Android 1.0相比有了很大的改进。6 k" ]. d5 V9 D( f" T# H
- 2009年9月,谷歌发布了Android 1.6的正式版,并且推出了搭载Android 1.6正式版的手机HTC Hero(G3),凭借着出色的外观设计以及全新的Android 1.6操作系统,HTC Hero(G3)成为当时全球最受欢迎的手机。Android 1.6也有一个有趣的甜品名称,它被称为Donut(甜甜圈)。
5 ?) z+ _' ^5 O; _ - 2010年2月,Linux内核开发者Greg Kroah-Hartman将Android的驱动程序从Linux内核“状态树”(“staging tree”)上除去,从此,Android与Linux开发主流将分道扬镳。在同年5月份,谷歌正式发布了Android 2.2操作系统。谷歌将Android 2.2操作系统命名为Froyo,翻译完名为冻酸奶。$ a' k' d0 k9 n) s- z3 Q% R. g; V
- 2010年10月,谷歌宣布Android系统达到了第一个里程碑,即电子市场上获得官方数字认证的Android应用数量已经达到了10万个,Android系统的应用增长非常迅速。在2010年12月,谷歌正式发布了Android 2.3操作系统Gingerbread (姜饼)。
! L- I1 {, m0 V4 D3 [3 k* } - 2011年1月,谷歌称每日的Android设备新用户数量达到了30万部,到2011年7月,这个数字增长到55万部,而Android系统设备的用户总数达到了1.35亿,Android系统已经成为智能手机领域占有量最高的系统。
) m# S6 l) ^; ]6 V( O, s7 R5 R4 ?7 P - 2011年8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一。* T. P3 E. w. F/ G @2 q* T6 B
- 2011年9月,Android系统的应用数目已经达到了48万,而在智能手机市场,Android系统的占有率已经达到了43%。继续在排在移动操作系统首位。谷歌将会发布全新的Android 4.0操作系统,这款系统被谷歌命名为Ice Cream Sandwich(冰激凌三明治)。
& Z4 N, m6 n, V7 o8 w* ^' k4 d4 i - 2012年1月6日,谷歌Android Market已有10万开发者推出超过40万活跃的应用,大多数的应用程序为免费。Android Market应用程序商店目录在新年首周周末突破40万基准,距离突破30万应用仅4个月。在2011年早些时候,Android Market从20万增加到30万应用也花了四个月。[5]
+ y$ ?0 l; R# C0 M, \! V - 2013年11月1日,Android4.4正式发布,从具体功能上讲,Android4.4提供了各种实用小功能,新的Android系统更智能,添加更多的Emoji表情图案,UI的改进也更现代,如全新的HelloiOS7半透明效果。
$ F E6 Y5 M& }+ O% \; c* ~ - 2015年,网络安全公司Zimperium研究人员警告,安卓(Android)存在“致命”安全漏洞,黑客发送一封彩信便能在用户毫不知情的情况下完全控制手机。[6]- y9 x8 @6 b' {) U6 I
- 2018年10月,谷歌表示,将于2018年12月6日停止Android系统中的Nearby Notifications(附近通知)服务,因为Android用户收到太多的附近商家推销信息的垃圾邮件。[7]
) o! N4 L) b8 z( i - 2020年3月,谷歌的Android安全公告中提到,新更新已经提供了CVE-2020-0069补丁来解决针对联发科芯片的一个严重安全漏洞。[8]3 P. z: R0 d/ C0 z
- ]]3 Y% I$ u& O0 J: l7 q
* i" P4 H/ m5 P: h5 {/ I6 @- 来源:代码手册 Robin
复制代码 |
|