登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 871|回复: 0

[lua教程] 【lua教程】自制气泡拖动条

[复制链接]

444

主题

509

帖子

2051

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2051

荣誉管理论坛元老

发表于 2021-7-1 08:22:24 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import") w0 m1 j% h3 C; L. D* a
  2. import "android.app.*"" |4 E0 }* V; Z1 P) Z* R, u
  3. import "android.os.*"
    2 e* c( {3 q0 A5 V2 l7 _+ K
  4. import "android.widget.*"$ g% P" S0 u+ E
  5. import "android.view.*"' Q2 i9 U' R' y! c& i) z
  6. ( ?! c2 _0 y6 D! Z; _
  7. activity.setTitle('自绘制气泡拖动条'); \# R: Z$ U0 W
  8. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题+ t, k0 Q. ]) ^- t' x9 W

  9. 4 m0 c" M2 H+ O- W: X4 M5 B6 C7 ~
  10. activity.setContentView(loadlayout({
    - g+ Q+ \2 O4 ~1 z" |
  11.   ScrollView;
    / G$ m+ [" W; @, d! ~
  12.   layout_height="fill";5 V  J1 Q$ |! ?* X5 w  y! k4 @
  13.   layout_width="fill";
    ( T% |& l0 c* Q1 y
  14.   {% u' {+ O" U7 h
  15.     LinearLayout;
    & C5 x% H/ s: R3 l
  16.     layout_width="fill";
    ! e! X& e+ q: }( W0 a
  17.     gravity="top";
    , Q3 c' b+ ~' m: C- m6 F
  18.     layout_height="fill";$ D# P1 D& O* W8 F0 L' d% A
  19.     orientation="vertical";" u/ Z! \9 H; f  }6 P1 R! J
  20.     {: |- C9 o( n- y3 q5 R
  21.       TextView;5 V- {3 Y) R9 g) @: `5 j
  22.       layout_width="fill";$ I( N! M) a3 Y* d; D0 Z2 O0 L
  23.       padding="15dp";; B; Z5 I! n  t2 E0 f/ e( _
  24.       id="t1";* M, y4 I7 A+ \0 K' `$ n3 d( ]
  25.     };1 [( E# H$ h3 W$ N
  26.     {# R  Y# |+ z5 l, w( T9 @6 c
  27.       View;
    ) @; ^. n/ L: p
  28.       layout_width="fill";
    ) r1 p7 t; n  V& X" Y+ U
  29.       layout_height="35dp";  `. b6 d% o0 s5 \, N  R
  30.       id="animseekBar";
    " a3 l2 W, I' i9 X
  31.     };/ W& E/ E; j  _' b
  32.     {% R) @% H1 ?! l
  33.       TextView;4 l( D( p) u7 W, \% U$ k0 a5 R- S* w, `
  34.       layout_width="fill";: Q8 `/ l$ l2 }: b
  35.       padding="15dp";
    3 I! O/ W/ p. m; S8 L
  36.       id="t2";2 @( B6 N/ R9 P) Y7 X
  37.     };4 i2 c# O! S, a0 F1 g. c, S
  38.   };6 J) E6 {1 M7 m- H" K
  39. }
    ! v$ m# ]2 a3 E* O
  40. ))2 P8 C: l, b7 y# m
  41. ' h1 d% B. F4 n4 s0 K  [
  42. import "android.graphics.*"
    4 |6 M! S" H+ L$ k5 B4 _
  43. import "android.graphics.Paint$Style"
    # ?1 C: P$ J( A* k) K3 e
  44. import "android.view.animation.*"! `5 {  c/ T$ ]9 Q6 a+ A  [
  45. import "android.animation.ObjectAnimator"
    / a5 P: a& z& X& s- U
  46. import "android.animation.PropertyValuesHolder"
    ) G! ~+ `) x' h

  47. : c" u& B' }' b1 S, \# m
  48. dip2px=function(dpValue): H$ p; I/ X( u
  49.   local scale = activity.getResources().getDisplayMetrics().density;
    # f* Z4 B4 v7 D/ @, m6 _/ B5 b8 I
  50.   return dpValue * scale + 0.5' t) P, G9 d4 `/ C1 x; b
  51. end/ d: s& u1 h6 J9 L) T9 ]
  52. ! B0 p0 @* D2 n8 ~, ]
  53. sp2px=function(spValues)
    ; O1 K1 r) m4 U
  54.   local fontScale = activity.getResources().getDisplayMetrics().scaledDensity;
    ( l  ~) X/ b8 z
  55.   return spValues * fontScale+ 0.5% o  l) I5 `6 O5 U
  56. end
    ! C6 N! J. p" Q; U

  57. 6 a8 ^5 _, I3 u- q1 L
  58. getStatusBarHeight=function()2 \7 j' g; _9 S6 U# M
  59.   _,statusBarHeight2=xpcall(function()9 Y/ Y1 U: V" i3 L$ C
  60.     local clazz=Class.forName("com.android.internal.R$dimen")
    9 z/ i$ h' j' @' G0 H
  61.     local object = clazz.newInstance();
    ! `" B( u4 E* w" F
  62.     local height = Integer.parseInt(tostring(clazz.getField("status_bar_height").get(object))); s. h0 p4 c# E# l
  63.     return this.getResources().getDimensionPixelSize(height);/ p* G+ d2 d. v' u) A* R! d+ J( r
  64.   end,
    : }/ W$ F9 a" l/ F5 X
  65. 1 l. w9 W* j# s! k4 a$ T( q& K! b
  66.   function(a)
    9 e( T8 P( @9 y- V8 g$ L+ H1 }
  67.     _,statusBarHeight1=pcall(function()
    ' g) M( J# ]1 @! X$ d
  68.       local resourceId = this.getResources().getIdentifier("status_bar_height", "dimen", "android");, o; V  Q9 m1 m% ]- S$ c
  69.       if resourceId > 01 i; a* \+ O9 _" u6 Z( v
  70.         return this.getResources().getDimensionPixelSize(resourceId);
    5 j7 n: u8 z( K( J) T
  71.       end
    : X6 Y% s8 W5 J, S+ L
  72.     end,/ G) A- B3 l: k+ \
  73.     function(e)
    * ~  x1 ~& K2 H' D
  74.     end,nil)$ T9 t3 v/ A( C3 p3 k: r

  75. ( R5 o& l/ @$ V# e
  76.   end,6 ~9 U$ m& Z$ f, S0 Y$ n7 A7 y' R% Y0 ?
  77.   nil)1 }  o: Q0 u3 a5 ]% Y. ~  A
  78.   if type(statusBarHeight2):lower()=="number"% o2 [7 G6 x' _. A( {. ?/ X+ N
  79.     return statusBarHeight2* n* D7 u# p6 p1 s5 R2 z
  80.    elseif type(statusBarHeight1):lower()=="number"1 y6 W7 m7 E; ~, k
  81.     return statusBarHeight1
    7 X2 S% K  ~( b! h4 u' A( f0 A% p
  82.    else
    6 A$ n  D) |0 x
  83.     return 02 h8 u  b* V& R, x
  84.   end6 i/ L6 w/ U4 p. g8 d  N
  85. end
    3 g. P) E& Z8 X0 ?) X4 o# S( F1 ]) g+ y

  86. / \$ D1 a3 X5 \
  87. BgColor=0xFFBDBDBD--背景色, d; _, Z/ j# l4 J! f
  88. TopColor=0xFF9C27B0--进度条颜色. j/ j8 \; |/ s. t$ m3 Q. y/ _
  89. TopHandleColor=0xFF9C27B0--滑块颜色
    * |4 ?& W3 C7 X7 j( a
  90. BubblesColor=0xffffffff--气泡字体颜色
    ( {1 M* F. L/ D! S# c5 j4 m+ V
  91. BgHeight=dip2px(3)--背景高度
    ! t) \% w& F6 p. g' c6 G
  92. TopHeight=dip2px(4)--进度条高度! B- Z9 y! S6 B
  93. TopHandle=dip2px(8)--滑块半径: ]! e4 K& {8 W- V5 }; B& D& D
  94. Max=100--最大值
    5 L% m4 [7 v: V5 m: p
  95. Dragprogress=0--当前进度
    ' C9 q! t' g  p# N
  96. CanvasMargin=dip2px(48)--边距3 p: |, f% }/ Q. w2 r
  97. bubblesTextSize=sp2px(12)--气泡内文字大小# J+ n) f: H3 @, s
  98. Seekbarids=animseekBar( N% s' ]4 Z5 ~# W2 A
  99. : k/ {9 D0 X8 q9 E8 c
  100. import "android.content.Context"3 A7 [8 S  N; |- n, T- A
  101. mWindowManager = activity.getSystemService(Context.WINDOW_SERVICE);; k- t1 D$ \; u

  102. 0 A( K' }+ q, ~) J* n' _6 c
  103. IndicatorWindow=function(getH,getW)
    , G2 }  r7 \; M9 m! |
  104.   local mLayoutParams = WindowManager.LayoutParams();
    4 `" q+ Q- n3 X5 y9 U. I
  105.   mLayoutParams.gravity = Gravity.START | Gravity.BOTTOM;0 G1 Q: P& ]+ H  M) @5 B
  106.   mLayoutParams.width =getW;
    + B% U) n! p) _4 v) A
  107.   mLayoutParams.height = getH;% Q5 W& m8 r$ @8 j: c
  108.   mLayoutParams.format = PixelFormat.TRANSLUCENT;
    3 v3 g' T' T" X
  109.   mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL% t) s8 B' H/ W2 P: n& p* R+ Y. {
  110.   | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    : S+ Y# H8 Q( H
  111.   | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;1 V% Q7 U  Z  G5 u
  112.   --MIUI禁止了开发者使用TYPE_TOAST,Android 7.1.1 对TYPE_TOAST的使用更严格; o3 f  r- [, l8 W) b% y, l5 f
  113.   if Build.MANUFACTURER:lower()~="xiaomi" or Build.VERSION.SDK_INT >= 252 }5 j5 O, w& w4 x. o: y0 v, m' l
  114.     mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;$ t9 U8 A" @3 p6 k
  115.    else
    8 }/ Q0 B$ T" I% `0 E
  116.     mLayoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;; y& C, v6 a7 m  p- a; R
  117.   end: g! g; z% s: U! Z4 K; v
  118.   return mLayoutParams
    - k2 R( v' y5 z) V* e
  119. end
    % p5 D0 ?2 q# n% }: p

  120. " x7 s/ R7 w. M5 M! M
  121. 0 k! i+ S+ f5 S8 x
  122. ShowBubbles=function(ids)& s0 N: b* I8 n- @, j( w9 _6 ?, v/ @9 ^
  123.   local mBubbleView=& w9 r5 x, A$ b( O
  124.   {
    * g  z  N4 m& Q. r6 N* E2 [% ~$ s- q
  125.     LinearLayout;* ?& F$ \" a9 \% {3 j- ~
  126.     layout_width="fill";
    " O- p$ V. y% M$ Y4 J4 D
  127.     layout_height="fill";
    $ D& X5 g" T% m1 t
  128.     id="Mcft_Main",- {7 Q! d0 Z' d: v0 I/ z1 C
  129.     {
    ; G" \1 X, o; G+ T; M/ D
  130.       View,
    ( z  E# ~; S) j  ]4 o
  131.       id=ids,
    2 G; R4 [( ^9 i
  132.       layout_width="54dp";$ R8 K3 }0 Z9 r. R6 s: Z
  133.       layout_height="55dp";1 p6 E2 E: c4 T& {
  134.       Visibility=View.GONE,
    0 `9 Z9 _3 v3 f9 V& s* a5 D7 L
  135.     }
    / @9 f" j) q0 j2 x
  136.   }
    2 q* E5 X3 {. e, V/ y
  137.   mWindowManager.addView(loadlayout(mBubbleView), IndicatorWindow(0,0) );
    / Q. X& U4 K- @) U0 P
  138. end: V+ O0 K7 L) g- _1 Q( t

  139. 9 F" ]) H6 i/ A, D
  140. PaintBubbles=function(progess)
    8 E& M. T) r# w9 \# [, j
  141.   newPaint=Paint(), d/ u  Y* m5 |! L( y  L( g
  142.   newPaint.setTextSize(bubblesTextSize)" }: V+ C( g6 w* z5 a
  143.   TextMin=newPaint.measureText(tostring(progess)), }& X+ ]. _( i2 |" L$ L* ^
  144.   Indicator=sp2px(24)
    ! x8 d9 [# p& E2 r7 i
  145.   BubblesSize=bubblesTextSize+sp2px(3)+ v5 B# P# x+ s9 M6 k7 M+ c' P( I
  146.   local Paintd=LuaDrawable(function(canvas,paint)
    / e& b' K- t7 [! W; y, K
  147.     local cW=canvas.Width
    3 M: d' {* H4 J9 x" \6 r
  148.     local cH=canvas.Height$ S1 f5 R9 T- j9 o7 g- ~
  149.     paint.setAntiAlias(true)
    % n8 B8 J' T1 U" r6 J/ W, I; |) }
  150.     paint.setStyle(Style.FILL);8 t, e" D9 ]8 m3 F+ G
  151. 9 i2 w; n5 U3 ^* E% ~
  152.     paint.setFakeBoldText(false)( ^1 @- _- I7 t" _
  153.     paint.setTextSize(bubblesTextSize)! G. e$ l% T8 m4 u, I* p- z
  154. 9 B$ x: V, s, |& O+ c& i( R# z
  155.     paint.setColor(TopHandleColor)3 m! a* ^3 t# B6 m
  156.     local path =Path()
    1 p# \# B# M4 c4 L9 s$ |
  157.     path.moveTo(Indicator/2,(cH/1.75))
    & L. O/ h& ~& d) X7 `- x
  158.     path.lineTo(cW-(Indicator/2),cH/1.75)
    4 f0 }/ g  ~4 H/ C* d" E
  159.     path.lineTo(cW/2,cH)8 n. O! R# Z' b1 A6 n
  160.     path.close()/ z  \2 d% J6 E" U3 |
  161.     canvas.drawPath(path, paint)
    0 y* {7 h2 @1 e2 [4 b0 }- ]

  162. 5 K" ]! c/ R; U$ X0 u' t1 B
  163.     canvas.drawCircle(cW/2,cH/2,BubblesSize, paint);5 Q+ x! K. p& W+ i9 r& \& y4 ?
  164. / T, a! o4 e* Y8 C
  165.     paint.setColor(BubblesColor)
    , d) I: b9 V" y% k, H
  166.     canvas.drawText(tostring(progess),(cW/2)-(TextMin/2),(cH/2)+(bubblesTextSize/2.5),paint)
    & C/ X+ A! |5 X" @' y
  167.   end)
    ! x+ v7 H. w! f  i  \8 p+ K' d
  168.   return {draw=Paintd,Circlesize=(BubblesSize*2)+Indicator}1 I* D; F- F" o  v. I. P- A
  169. end
    8 [& _2 ^- g6 [8 x

  170. & [2 x  Q$ @, c+ D9 N/ u6 X, L

  171. % z" ^* S: q& m3 d
  172.   H+ S" E# d+ G1 d) |* [' Y
  173. locationUpdate=function(views,getX,getY,progess)
    / j9 N: K/ L  |6 ]5 G! N$ q
  174.   local outRect1 = Rect();
    1 J! q/ `) @+ V/ [" M2 h' A
  175.   activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
    # z; o4 e( a( {$ r+ u
  176.   local WidowHeight=outRect1.height()6 h! }" }3 }; h. _& J3 S
  177.   -Seekbarids.getParent().getHeight()
    ; n# T+ }2 F  F: G3 y9 v
  178.   local clazz=Class.forName("com.android.internal.R$dimen"); I, i/ m- @$ U  i0 S
  179.   local object = clazz.newInstance();$ A; c) E6 H6 M6 Z4 ^" d1 f- [" L
  180.   local height = Integer.parseInt(tostring(clazz.getField("status_bar_height").get(object)))
    - _8 E7 X: c. E7 @8 u
  181.   local status_bar_height = this.getResources().getDimensionPixelSize(height);7 `" m4 c: U3 h: A6 @1 s; D
  182. % S( D9 p5 Q# }1 l; P5 t& C0 o
  183.   local BuDraw=PaintBubbles(progess)
    ' l2 h, X6 M1 Q2 Y2 k. y
  184.   views.setBackground(BuDraw.draw)
    & }& h- {1 Z9 a9 f8 T1 [) S
  185.   views.setX(getX+((CanvasMargin/2)-(views.getWidth()/2)))% Z6 |1 l& E( k# D
  186.   views.setY((getY+status_bar_height)-(views.getHeight()/2))) a, C# G: ?9 f' j$ \' C
  187.   --views.setImageDrawable(BuDraw.draw)3 p! }) s$ t  v! T: T7 R
  188.   local newParams=IndicatorWindow(outRect1.height(),Seekbarids.getParent().getWidth())$ }. r/ ^( U0 F  m
  189.   mWindowManager.updateViewLayout(views.getParent(), newParams);0 `' p& i& {& V( U
  190. ; _3 D: o, I! x/ I+ V
  191. end
    ( _- p- G8 d7 `- \
  192. 7 k$ S; V% l8 i% u4 n2 L
  193. LogoutBubble=function(view)8 o) G# Y8 Q; q0 @4 e
  194.   mWindowManager.removeViewImmediate(view.getParent());
    ) y' h3 E5 |+ ]" L
  195. end
    # c, V, i8 v/ A8 o9 X0 r& V

  196. / {3 @6 G1 R9 v
  197. $ ]( O" p- y# `4 F
  198. PropertyS=function(a,b,view,isType)
    4 `/ c0 D7 v" G7 ^
  199.   local Attribute_definition = PropertyValuesHolder.ofFloat("method",{ a,b}): W& h' U5 G! F" H4 N+ _
  200.   local mValueAnimator = ObjectAnimator.ofPropertyValuesHolder({Attribute_definition})
    " N) }$ I& w6 W0 H- p- e8 R% I
  201.   .setStartDelay(0)
    / C6 d8 H' ^- g- X# x5 G. r* P* [
  202.   .setInterpolator(AnticipateOvershootInterpolator())- ?) ^, |/ X9 O0 a! B
  203.   .setDuration(500)
    # ~2 m# H9 E3 |4 p
  204.   mValueAnimator.addUpdateListener({
    % v6 k/ ], `0 F3 S& |2 b
  205.     onAnimationUpdate=function(animation)( s: v/ s( g$ x* ?
  206.       local Animationaprogress=animation.getAnimatedValue()+ F* ~; H" \1 c0 R5 ^
  207.       if isType
    4 k. f' S) ~2 q0 y
  208.         view.setVisibility(View.VISIBLE)( Q9 ~+ [/ u7 p4 s5 Y
  209.       end
    3 U0 p+ Y+ o' l3 p& E' R' v
  210.       view.setAlpha(Animationaprogress)
    # ~& D- c7 |9 o3 k: K' G
  211.       view.setPivotY(view.getHeight()*1.4)
    9 N( M; @1 m' E' S& U4 \$ Z
  212.       .setPivotX(view.getWidth()/2)' o3 U& |' @0 F7 ~. _7 q  D4 ~- u
  213.       .setScaleX(Animationaprogress)- E3 C. e# `' m0 H2 Z  [1 V/ r
  214.       .setScaleY(Animationaprogress)7 \) \4 ]3 c  j  ^0 Y* b
  215.       --.setRotationX(-90+(Animationaprogress*90))$ Z4 e! a1 N3 ~8 L& U3 D1 t
  216.       AnimFolatN=Animationaprogress8 e1 P9 E+ Y0 p& `4 y) M2 o7 M/ T
  217.       SeekbarAmin.invalidateSelf()
    3 O: [" a6 ^8 \: p
  218.     end,% g" Z& L4 @1 X1 n$ e
  219.   });5 Y6 ^* I# ?1 o- w, D8 k
  220.   mValueAnimator.addListener({+ T( z) S. l) n& h) S/ `
  221.     onAnimationEnd=function()3 u9 v' |% a  t. M
  222.       if not isType
    $ g- Y& K6 L) G1 _6 T; h( {7 T/ M
  223.         view.setVisibility(View.GONE)- V  Y" \5 _$ B% G4 X+ ]: l
  224.         LogoutBubble(view): C: Z6 a; L2 G; [) f
  225.       end
    3 H8 o( C$ ^' E3 \0 Z
  226.     end3 f, k  }, s% u6 f' T' h
  227.   }).start()4 m- i, {8 s$ G" i) H
  228. end" W3 y/ u6 t8 D5 i% U

  229. 7 `# T9 L; D$ O1 {$ g3 M

  230. 6 j- _: K& N/ F) u0 u$ o) w
  231. --mBubbleView.setVisibility(GONE); --防闪烁3 d6 r$ [; \" n  s! O* ^! O

  232. $ D! X3 I7 ?* w# `+ @& k& k5 Z! K
  233. --mLayoutParams.x = (mBubbleCenterRawX + 0.5f);
    + [; H# C$ h- e* t( T  L
  234. --mWindowManager.updateViewLayout(mBubbleView, mLayoutParams);! R0 E$ h7 p4 i& W  m. N

  235. 3 ^! P) f( ], c& e" d
  236. $ N. j/ X4 C& R: K) k2 x
  237. getWidthPercentage=function(w,max,proges)( `7 I& N' V% q; u8 Q
  238.   local WidthDivision=(w/max)*proges* Q" @6 U( v5 X, N. ^( ]+ H3 Q
  239.   return {TowX=WidthDivision,Proges=proges}; t+ L( K5 F$ r! Z0 D
  240. end: n5 u8 Q# E1 `3 H5 Y3 i" ]
  241. ; ~( T: s6 q2 `9 U' Z
  242. AnimFolatN=0
    & ]3 h8 w/ ^0 Y' ]4 R
  243. SeekbarAmin=LuaDrawable(function(canvas,piant,d)
    9 r) L# w, E. k7 L
  244.   canvasWidth=canvas.getWidth()-CanvasMargin4 H1 v, p* I8 H
  245.   canvasHeight=canvas.getHeight(). ?2 I' P( X# @6 d' N
  246. # J% C* n) @# }( K1 |. ~
  247.   canvas.translate(CanvasMargin/2,0)! G2 u" W9 I- v6 L: \) K
  248. 2 X& R1 I# O: z; `7 s
  249.   piant.setStrokeCap(Paint.Cap.ROUND)
    $ Z. q6 J* v$ `' f' s0 C
  250.   piant.setAntiAlias(true). M% s* {) x& P# `* ^; z( W
  251. & e0 Q; ]( ?0 S4 V3 |
  252.   --画背景进度条
    & N& T1 n0 O; q% h5 G
  253.   piant.setColor(BgColor);
    6 ]+ n3 U- L7 L3 f0 S1 K: X0 w2 x
  254.   piant.setStrokeWidth(BgHeight);9 T' Y6 I6 c1 X! ?" M
  255.   canvas.drawLines({0,canvasHeight/2,canvasWidth,canvasHeight/2},piant)
    3 B' M5 X; A9 u7 b4 f; A# B; q& c

  256. / B' e' S; c0 i9 e! y* t
  257.   --画顶部进度条5 Q1 i' R; |8 l  p/ K1 U
  258.   piant.setColor(TopColor);1 k. f6 m4 X# _4 P/ q( F
  259.   piant.setStrokeWidth(TopHeight+((TopHeight/4)*AnimFolatN));
    2 E0 h! O2 H  ~
  260.   canvas.drawLines({0,canvasHeight/2,getWidthPercentage(canvasWidth,Max,Dragprogress).TowX,canvasHeight/2},piant)
    ! ^8 P' w# X2 {5 o- G

  261. 8 U6 B' j7 Q0 q* s  W! x
  262.   --画滑块
    2 Z# r6 w, X# R) s
  263.   piant.setColor(0x23000000);
      Z% ^5 a9 v" y* n4 e
  264.   canvas.drawCircle(getWidthPercentage(canvasWidth,Max,Dragprogress).TowX,canvasHeight/2,((TopHandle*1.7)*AnimFolatN), piant);8 \. r8 [2 t$ z1 X
  265.   piant.setColor(TopHandleColor);
    9 J) W5 Y4 p* X3 U- t
  266.   canvas.drawCircle(getWidthPercentage(canvasWidth,Max,Dragprogress).TowX,canvasHeight/2,TopHandle-((TopHandle)*AnimFolatN), piant);9 M5 _  ?$ S+ Q# }! U/ W
  267. end)9 E) Q* V7 l- e0 `& f! B3 }( e
  268. , m  x$ V8 Y4 X
  269. Seekbarids.background=SeekbarAmin
    ) {1 a6 T. t: i" N+ C! h
  270.   D" C5 [0 J! G
  271. getPView=function(a)0 v- p: }  {8 f
  272.   a=a.getParent()
    + F9 e. d& H3 x& _' `5 f. O
  273.   while a~=nil and not tostring(a):find("ScrollView")
    2 C- V2 Q  V2 m" W, ^% Z0 V
  274.     a=a.getParent()
    2 q4 m$ w' d7 }& f* \/ d4 s
  275.   end
    5 B2 T3 S$ Z6 {0 r( K
  276.   return a==nil and 0 or a.getScrollY()- z# A/ `- P- [
  277. end
    " x! K8 z9 t0 X3 _, x
  278. : }' @' k% f0 D- @7 c, _: G
  279. Seekbarids.onTouch=function(v,event)
    ( G9 H2 S' t5 ]8 g' p
  280.   local Maction=event.getAction()- ?* f' Y, w& g: Q
  281.   if Maction==MotionEvent.ACTION_DOWN
    0 s9 j& h, \. D4 N$ A
  282.     if event.getX()>CanvasMargin/2 and event.getX()<v.getWidth()-CanvasMargin/2# q, `1 x! l8 [7 L' H# L
  283.       and event.getY()>(v.getHeight()/2)-TopHandle and event.getY()<(v.getHeight()/2)+TopHandle
    - E" j% x4 U# \; q3 ]+ Y( U: I
  284.       WithinRange=true
    ' i6 c" V' o% m0 P) |- _  ]
  285.       ShowBubbles("bubbles")
    2 v( ^% i6 ]/ E- B3 P& [) W
  286.       PropertyS(0,1,bubbles,true)) h% K; G# o+ n) d- g* B6 o# W
  287.       v.getParent().requestDisallowInterceptTouchEvent(true);
    " r3 e7 w' j3 z0 O* }) i+ |- [) ]
  288.      else' d7 @8 [% m# n; ~
  289.       WithinRange=false3 d7 P  P$ ~! p2 l% v
  290.     end
    - D* A$ ^' M- c! n& `5 j$ X
  291.    elseif Maction==MotionEvent.ACTION_MOVE
    $ Q. j6 @" ?, J& I: p( Z; r
  292.     if WithinRange' a2 d8 @% q. t2 L
  293.       v.getParent().requestDisallowInterceptTouchEvent(true);0 B1 D+ }/ w. Y
  294.       local getXTo=event.getX()
    ; K1 I0 n7 o% ?- d% t
  295.       local ranger=(event.getX()-CanvasMargin/2)/(v.getWidth()-CanvasMargin)
    9 R( f' @/ e& ^. o9 H' e6 O3 N2 {: U
  296.       --计算百分比
      `2 ?3 Z6 R# U) r
  297.       Dragprogress=tointeger((ranger<=0 and 0 or (ranger>=1 and 1 or ranger))*Max)8 X& K3 z: k, ]1 a
  298.       locationUpdate(bubbles,getWidthPercentage(Seekbarids.getWidth()-CanvasMargin,Max,Dragprogress).TowX# u+ u- g0 ~! _
  299.       ,Seekbarids.getY()-getPView(v),Dragprogress)
    $ M, V0 e3 }/ s: U! `) [6 D6 c& J
  300.       SeekbarAmin.invalidateSelf()
      |) `$ b( w* R* J& T# b: |( X
  301.     end
    2 F5 L. X1 x& T) g. E+ o
  302.    elseif Maction==MotionEvent.ACTION_UP
    + \( r( S, V2 ~2 p
  303.     v.getParent().requestDisallowInterceptTouchEvent(false);
    ' E, O2 Z! X0 k3 t% t
  304.     pcall(function()
    4 d; B3 W* L  Y; H& X
  305.       if bubbles and WithinRange- D! a+ x/ v$ g5 o
  306.         PropertyS(1,0,bubbles,false)
    7 Q! i9 E3 x1 r& n. E) P% U! j* F$ b
  307.       end
    ! t1 K/ b8 h( V' Q* }( @
  308.     end); \1 a7 L' \$ s1 a6 x  x* o$ w7 [! T
  309.   end
    , S) P1 Z& ]; g8 I5 O) E) j
  310.   return true;
    " N% D* x( Q# v* S- ]! A6 F/ z
  311. end
    , |: D$ }5 A- Z1 b1 r0 F

  312. & s( D3 L5 X5 W
  313. t1.text=[[+ x" c, I4 S- N
  314. Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。2 V9 i9 L. U+ f7 _
  315. ]]
    9 v; W% S) L1 Z$ ~& ]: w8 v
  316. t2.text=[[. {5 E; i3 \3 g: B( b, D
  317. 2003年10月,Andy Rubin等人创建Android公司,并组建Android团队。% L1 C* o" i( E" x/ _% ?# j
  318. 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队。安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。9 [2 u5 ?$ o( @6 z3 j$ h7 q
  319. 2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(Open Handset Alliance)来共同研发改良Android系统,这一联盟将支持谷歌发布的手机操作系统以及应用软件,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。[3] [4]" N0 A& J  T  x, G# a- e
  320. 2008年,在GoogleI/O大会上,谷歌提出了AndroidHAL架构图,在同年8月18号,Android获得了美国联邦通信委员会(FCC)的批准,在2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本。
    4 {/ j0 v1 ]3 l7 ^% A
  321. 2009年4月,谷歌正式推出了Android 1.5这款手机,从Android 1.5版本开始,谷歌开始将Android的版本以甜品的名字命名,Android 1.5命名为Cupcake(纸杯蛋糕)。该系统与Android 1.0相比有了很大的改进。6 k" ]. d5 V9 D( f" T# H
  322. 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; _
  323. 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
  324. 2010年10月,谷歌宣布Android系统达到了第一个里程碑,即电子市场上获得官方数字认证的Android应用数量已经达到了10万个,Android系统的应用增长非常迅速。在2010年12月,谷歌正式发布了Android 2.3操作系统Gingerbread (姜饼)。
    ! L- I1 {, m0 V4 D3 [3 k* }
  325. 2011年1月,谷歌称每日的Android设备新用户数量达到了30万部,到2011年7月,这个数字增长到55万部,而Android系统设备的用户总数达到了1.35亿,Android系统已经成为智能手机领域占有量最高的系统。
    ) m# S6 l) ^; ]6 V( O, s7 R5 R4 ?7 P
  326. 2011年8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一。* T. P3 E. w. F/ G  @2 q* T6 B
  327. 2011年9月,Android系统的应用数目已经达到了48万,而在智能手机市场,Android系统的占有率已经达到了43%。继续在排在移动操作系统首位。谷歌将会发布全新的Android 4.0操作系统,这款系统被谷歌命名为Ice Cream Sandwich(冰激凌三明治)。
    & Z4 N, m6 n, V7 o8 w* ^' k4 d4 i
  328. 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
  329. 2013年11月1日,Android4.4正式发布,从具体功能上讲,Android4.4提供了各种实用小功能,新的Android系统更智能,添加更多的Emoji表情图案,UI的改进也更现代,如全新的HelloiOS7半透明效果。
    $ F  E6 Y5 M& }+ O% \; c* ~
  330. 2015年,网络安全公司Zimperium研究人员警告,安卓(Android)存在“致命”安全漏洞,黑客发送一封彩信便能在用户毫不知情的情况下完全控制手机。[6]- y9 x8 @6 b' {) U6 I
  331. 2018年10月,谷歌表示,将于2018年12月6日停止Android系统中的Nearby Notifications(附近通知)服务,因为Android用户收到太多的附近商家推销信息的垃圾邮件。[7]
    ) o! N4 L) b8 z( i
  332. 2020年3月,谷歌的Android安全公告中提到,新更新已经提供了CVE-2020-0069补丁来解决针对联发科芯片的一个严重安全漏洞。[8]3 P. z: R0 d/ C0 z
  333. ]]3 Y% I$ u& O0 J: l7 q

  334. * i" P4 H/ m5 P: h5 {/ I6 @
  335. 来源:代码手册 Robin
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区 |网站地图

GMT+8, 2024-5-3 00:35 , Processed in 0.080727 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表