1. 程式人生 > >Android 5.0學習之動畫

Android 5.0學習之動畫

前言

使用者跟你的App進行互動時,Material Design中的動畫給予使用者動作的反饋和提供視覺的一致感。

包括之前我學習過的:

除我們已經學習過的動畫之外,Material Design還給我們提供了什麼動畫?

Touch feedback(觸控反饋)Reveal effect(揭露效果)Curved motion(曲線運動)View state changes (檢視狀態改變)Touch feedback(觸控反饋)

當用戶與使用者介面進行互動時,materialdesign中的觸控反饋在觸控點上提供了一種瞬時視覺確認。按鈕的預設觸控反饋動畫使用新的RippleDrawable

類,它使用漣漪(波紋)效應在不同狀態間轉換。

在大多數情況下,你應該在你的佈局XML檔案中使用如下的方法去指定檢視的背景:

?android:attr/selectableItemBackground (有界波紋)

?android:attr/selectableItemBackgroundBorderless (無界波紋)

注意:selectableItemBackgroundBorderless是API級別21上的新屬性。

效果如下:


layout:

[html] view plaincopyprint?
  1. <Buttonandroid:layout_width=
    "100dp"android:layout_height="100dp"
  2.                android:background="?android:attr/selectableItemBackground"
  3.                android:text="有界"
  4.                android:textColor="@android:color/white"
  5.                android:colorControlHighlight="@android:color/holo_red_dark"/>
  6.        <Buttonandroid:layout_width
    ="100dp"android:layout_height="100dp"
  7.                android:background="?android:attr/selectableItemBackgroundBorderless"
  8.                android:textColor="@android:color/white"
  9.                android:text="無界"/>

或者,你可以定義一個RippleDrawable作為波紋元素的XML資源

[html] view plaincopyprint?
  1. <ripple
  2.     xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:color="@color/accent_dark">
  4.     <item>
  5.         <shape
  6.             android:shape="oval">
  7.             <solidandroid:color="?android:colorAccent"/>
  8.         </shape>
  9.     </item>
  10. </ripple>

你可以給RippleDrawable物件指定一種顏色。要更改預設的觸控反饋顏色,使用主題的android:colorControlHighlight屬性

Reveal effect揭示效果)


[java] view plaincopyprint?
  1. public Animator createAnimation(View v, Boolean isFirst) {  
  2.       Animator animator;  
  3.       if (isFirst) {  
  4.           animator = ViewAnimationUtils.createCircularReveal(  
  5.                   v,// 操作的檢視
  6.                   0,// 動畫開始的中心點X
  7.                   0,// 動畫開始的中心點Y
  8.                   v.getWidth(),// 動畫開始半徑
  9.                   0);// 動畫結束半徑
  10.       } else {  
  11.           animator = ViewAnimationUtils.createCircularReveal(  
  12.                   v,// 操作的檢視
  13.                   0,// 動畫開始的中心點X
  14.                   0,// 動畫開始的中心點Y
  15.                   0,// 動畫開始半徑
  16.                   v.getWidth());// 動畫結束半徑
  17.       }  
  18.       animator.setInterpolator(new DecelerateInterpolator());  
  19.       animator.setDuration(500);  
  20.       return animator;  
  21.   }  
  22.   staticboolean isFirst = false;  
  23.   @Override
  24.   publicvoid onClick(View v) {  
  25.       createAnimation(myView, isFirst).start();  
  26.       isFirst = !isFirst;  
  27.   }  

Curved motion(曲線運動)

Material design中的動畫依靠曲線,這個曲線適用於時間插值器和控制元件運動模式。

類是一個基於貝塞爾曲線(Bézier curve)或路徑(Path)物件上的新的插值器。

在materialdesign規範中,系統提供了三個基本的曲線:

@interpolator/fast_out_linear_in.xml

@interpolator/fast_out_slow_in.xml

@interpolator/linear_out_slow_in.xml

類有了新的構造方法,使你能夠一次能同時使用兩個或多個屬性去繪製動畫的路徑。例如,下面的動畫使用一個Path物件進行檢視X和Y屬性的動畫繪製:

[java] view plaincopyprint?
  1. ObjectAnimator mAnimator;  
  2. mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);  
  3. ...  
  4. mAnimator.start();  

在Android 5.0 提供的API Demos -》Animation/Path Animations 就有一個例子使用了曲線動畫:


Path Animations 原始碼:

[java] view plaincopyprint?
  1. /* 
  2.  * Copyright (C) 2013 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */
  16. package com.example.android.apis.animation;  
  17. import android.animation.ObjectAnimator;  
  18. import android.animation.TypeConverter;  
  19. import android.animation.ValueAnimator;  
  20. import android.app.Activity;  
  21. import android.content.Context;  
  22. import android.graphics.Canvas;  
  23. import android.graphics.Matrix;  
  24. import android.graphics.Paint;  
  25. import android.graphics.Path;  
  26. import android.graphics.Point;  
  27. import android.graphics.PointF;  
  28. import android.graphics.RectF;  
  29. import android.os.Bundle;  
  30. import android.util.AttributeSet;  
  31. import android.util.FloatMath;  
  32. import android.util.Log;  
  33. import android.util.Property;  
  34. import android.view.View;  
  35. import android.view.animation.Animation;  
  36. import android.view.animation.LinearInterpolator;  
  37. import android.widget.FrameLayout;  
  38. import android.widget.RadioGroup;  
  39. import com.example.android.apis.R;  
  40. /** This application demonstrates the use of Path animation. */
  41. publicclass PathAnimations extends Activity implements
  42.         RadioGroup.OnCheckedChangeListener, View.OnLayoutChangeListener {  
  43.     finalstatic Path sTraversalPath = new Path();  
  44.     finalstaticfloat TRAVERSE_PATH_SIZE = 7.0f;  
  45.     finalstatic Property<PathAnimations, Point> POINT_PROPERTY  
  46.             = new Property<PathAnimations, Point>(Point.class"point") {  
  47.         @Override
  48.         public Point get(PathAnimations object) {  
  49.             View v = object.findViewById(R.id.moved_item);  
  50.             returnnew Point(Math.round(v.getX()), Math.round(v.getY()));  
  51.         }  
  52.         @Override
  53.         publicvoid set(PathAnimations object, Point value) {  
  54.             object.setCoordinates(value.x, value.y);  
  55.         }  
  56.     };  
  57.     static {  
  58.         float inverse_sqrt8 = FloatMath.sqrt(0.125f);  
  59.         RectF bounds = new RectF(1133);  
  60.         sTraversalPath.addArc(bounds, 45180);  
  61.         sTraversalPath.addArc(bounds, 225180);  
  62.         bounds.set(1.5f + inverse_sqrt8, 1.5f + inverse_sqrt8, 2.5f + inverse_sqrt8,  
  63.                 2.5f + inverse_sqrt8);  
  64.         sTraversalPath.addArc(bounds, 45180);  
  65.         sTraversalPath.addArc(bounds, 225180);  
  66.         bounds.set(4163);  
  67.         sTraversalPath.addArc(bounds, 135, -180);  
  68.         sTraversalPath.addArc(bounds, -45, -180);  
  69.         bounds.set(4.5f - inverse_sqrt8, 1.5f + inverse_sqrt8, 5.5f - inverse_sqrt8, 2.5f + inverse_sqrt8);  
  70.         sTraversalPath.addArc(bounds, 135, -180);  
  71.         sTraversalPath.addArc(bounds, -45, -180);  
  72.         sTraversalPath.addCircle(3.5f, 3.5f, 0.5f, Path.Direction.CCW);  
  73.         sTraversalPath.addArc(new RectF(1266), 0180);  
  74.     }  
  75.     private CanvasView mCanvasView;  
  76.     private ObjectAnimator mAnimator;  
  77.     /** Called when the activity is first created. */
  78.     @Override
  79.     publicvoid onCreate(Bundle savedInstanceState) {  
  80.         super.onCreate(savedInstanceState);  
  81.         setContentView(R.layout.path_animations);  
  82.         mCanvasView = (CanvasView) findViewById(R.id.canvas);  
  83.         mCanvasView.addOnLayoutChangeListener(this);  
  84.         ((RadioGroup) findViewById(R.id.path_animation_type)).setOnCheckedChangeListener(this);  
  85.     }  
  86.     publicvoid setCoordinates(int x, int y) {  
  87.         changeCoordinates((float) x, (float) y);  
  88.     }  
  89.     publicvoid changeCoordinates(float x, float y) {  
  90.         View v = findViewById(R.id.moved_item);  
  91.         v.setX(x);  
  92.         v.setY(y);  
  93.     }  
  94.     publicvoid setPoint(PointF point) {  
  95.         changeCoordinates(point.x, point.y);  
  96.     }  
  97.     @Override
  98.     publicvoid onCheckedChanged(RadioGroup group, int checkedId) {  
  99.         startAnimator(checkedId);  
  100.     }  
  101.     @Override
  102.     publicvoid onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,  
  103.             int oldTop, int oldRight, int oldBottom) {  
  104.         int checkedId = ((RadioGroup)findViewById(R.id.path_animation_type)).getCheckedRadioButtonId();  
  105.         if (checkedId != RadioGroup.NO_ID) {  
  106.             startAnimator(checkedId);  
  107.         }  
  108.     }  
  109.     privatevoid startAnimator(int checkedId) {  
  110.         if (mAnimator != null) {  
  111.             mAnimator.cancel();  
  112.             mAnimator = null;  
  113.         }  
  114.         View view = findViewById(R.id.moved_item);  
  115.         Path path = mCanvasView.getPath();  
  116.         if (path.isEmpty()) {  
  117.             return;  
  118.         }  
  119.         switch (checkedId) {  
  120.             case R.id.named_components:  
  121.                 // Use the named "x" and "y" properties for individual (x, y)
  122.                 // coordinates of the Path and set them on the view object.
  123.                 // The setX(float) and setY(float) methods are called on view.
  124.                 // An int version of this method also exists for animating
  125.                 // int Properties.
  126.                 mAnimator = ObjectAnimator.ofFloat(view, "x""y", path);  
  127.                 break;  
  128.             case R.id.property_components:  
  129.                 // Use two Properties for individual (x, y) coordinates of the Path
  130.                 // and set them on the view object.
  131.                 // An int version of this method also exists for animating
  132.                 // int Properties.
  133.                 mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);  
  134.                 break;  
  135.             case R.id.multi_int:  
  136.                 // Use a multi-int setter to animate along a Path. The method
  137.                 // setCoordinates(int x, int y) is called on this during the animation.
  138.                 // Either "setCoordinates" or "coordinates" are acceptable parameters
  139.                 // because the "set" can be implied.
  140.                 mAnimator = ObjectAnimator.ofMultiInt(this"setCoordinates", path);  
  141.                 break;  
  142.             case R.id.multi_float:  
  143.                 // Use a multi-float setter to animate along a Path. The method
  144.                 // changeCoordinates(float x, float y) is called on this during the animation.
  145.                 mAnimator = ObjectAnimator.ofMultiFloat(this"changeCoordinates", path);  
  146.                 break;  
  147.             case R.id.named_setter:  
  148.                 // Use the named "point" property to animate along the Path.
  149.                 // There must be a method setPoint(PointF) on the animated object.
  150.                 // Because setPoint takes a PointF parameter, no TypeConverter is necessary.
  151.                 // In this case, the animated object is PathAnimations.
  152.                 mAnimator = ObjectAnimator.ofObject(this"point"null, path);  
  153.                 break;  
  154.             case R.id.property_setter:  
  155.                 // Use the POINT_PROPERTY property to animate along the Path.
  156.                 // POINT_PROPERTY takes a Point, not a PointF, so the TypeConverter
  157.                 // PointFToPointConverter is necessary.
  158.                 mAnimator = ObjectAnimator.ofObject(this, POINT_PROPERTY,  
  159.                         new PointFToPointConverter(), path);  
  160.                 break;  
  161.         }  
  162.         mAnimator.setDuration(10000);  
  163.         mAnimator.setRepeatMode(Animation.RESTART);  
  164.         mAnimator.setRepeatCount(ValueAnimator.INFINITE);  
  165.         mAnimator.setInterpolator(new LinearInterpolator());  
  166.         mAnimator.start();  
  167.     }  
  168.     publicstaticclass CanvasView extends FrameLayout {  
  169.         Path mPath = new Path();  
  170.         Paint mPathPaint = new Paint();  
  171.         public CanvasView(Context context) {  
  172.             super(context);  
  173.             init();  
  174.         }  
  175.         public CanvasView(Context context, AttributeSet attrs) {  
  176.             super(context, attrs);  
  177.             init();  
  178.         }  
  179.         public CanvasView(Context context, AttributeSet attrs, int defStyle) {  
  180.             super(context, attrs, defStyle);  
  181.             init();  
  182.         }  
  183.         privatevoid init() {  
  184.             setWillNotDraw(false);  
  185.             mPathPaint.setColor(0xFFFF0000);  
  186.             mPathPaint.setStrokeWidth(2.0f);  
  187.             mPathPaint.setStyle(Paint.Style.STROKE);  
  188.         }  
  189.         @Override
  190.         protectedvoid onLayout(boolean changed, int left, int top, int right, int bottom) {  
  191.             super.onLayout(changed, left, top, right, bottom);  
  192.             if (changed) {  
  193.                 Matrix scale = new Matrix();  
  194.                 float scaleWidth = (right-left)/TRAVERSE_PATH_SIZE;  
  195.                 float scaleHeight= (bottom-top)/TRAVERSE_PATH_SIZE;  
  196.                 scale.setScale(scaleWidth, scaleHeight);  
  197.                 sTraversalPath.transform(scale, mPath);  
  198.             }  
  199.         }  
  200.         public Path getPath() {  
  201.             return mPath;  
  202.         }  
  203.         @Override
  204.         publicvoid draw(Canvas canvas) {  
  205.             canvas.drawPath(mPath, mPathPaint);  
  206.             super.draw(canvas);  
  207.         }  
  208.     }  
  209.     privatestaticclass PointFToPointConverter extends TypeConverter<PointF, Point> {  
  210.         Point mPoint = new Point();  
  211.         public PointFToPointConverter() {  
  212.             super(PointF.class, Point.class);  
  213.         }  
  214.         @Override
  215.         public Point convert(PointF value) {  
  216.             mPoint.set(Math.round(value.x), Math.round(value.y));  
  217.             return mPoint;  
  218.         }  
  219.     }  
  220. }  
layout: [html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.               android:orientation="vertical"
  4.               android:layout_width="match_parent"
  5.               android:layout_height="match_parent">
  6.     <ScrollViewandroid:layout_width="match_parent"
  7.                 android:layout_height="wrap_content">
  8.         <RadioGroupandroid:orientation="horizontal"
  9.                     android:layout_width="wrap_content"
  10.                     android:layout_height="wrap_content"
  11.                     android:id="@+id/path_animation_type"
  12.                 >
  13.             <RadioButtonandroid:id="@+id/named_components"
  14.                          android:layout_width="wrap_content"
  15.                          android:layout_height="wrap_content"
  16.                          android:text="Named Components"/>
  17.             <RadioButtonandroid:id="@+id/property_components"
  18.                          android:layout_width="wrap_content"
  19.                          android:layout_height="wrap_content"
  20.                          android:text="Property Components"/>
  21.             <RadioButtonandroid:id="@+id/multi_int"
  22.                          android:layout_width="wrap_content"
  23.                          android:layout_height="wrap_content"
  24.                          android:text="Multi-int"/>
  25.             <RadioButtonandroid:id="@+id/multi_float"
  26.                          android:layout_width="wrap_content"
  27.                          android:layout_height="wrap_content"
  28.                          android:text="Multi-float"/>
  29.             <RadioButtonandroid:id="@+id/named_setter"
  30.                          android:layout_width="wrap_content"
  31.                          android:layout_height="wrap_content"
  32.                          android:text="Named Property"/>
  33.             <RadioButtonandroid:id="@+id/property_setter"
  34.                          android:layout_width="wrap_content"
  35.                          android:layout_height="wrap_content"
  36.                          android:text="Property"/>
  37.         </RadioGroup>
  38.     </ScrollView>
  39.     <viewclass="com.example.android.apis.animation.PathAnimations$CanvasView"
  40.           android:id="@+id/canvas"
  41.           android:layout_width="match_parent"
  42.           android:layout_height="0px"
  43.           android:layout_weight="1">
  44.         <ImageViewandroid:id="@+id/moved_item"
  45.                    android:layout_width="wrap_content"
  46.                    android:layout_height="wrap_content"
  47.                    android:src="@drawable/frog"/>
  48.     </view>
  49. </LinearLayout>


View state changes(檢視狀態改變)

使用步驟

[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:state_pressed="true">
  4.     <set>
  5.         <objectAnimatorandroid:propertyName="translationZ"
  6.                         android:duration="@android:integer/config_shortAnimTime"
  7.                         android:valueTo="10"
  8.                         android:valueType="floatType"/>
  9.         <objectAnimatorandroid:propertyName="rotationX"
  10.                         android:duration="@android:integer/config_shortAnimTime"
  11.                         android:valueTo="360"
  12.                         android:valueType="floatType"/>
  13.     </set>
  14. </item>
  15. <item
  16.       android:state_pressed="false"
  17.       >
  18.     <set>
  19.         <objectAnimatorandroid:propertyName="translationZ"
  20.                         android:duration="10000"
  21.                         android:valueTo="0"
  22.                         android:valueType="floatType"/>
  23.         <objectAnimatorandroid:propertyName="rotationX"
  24.                         android:duration="@android:integer/config_shortAnimTime"
  25.                         android:valueTo="0"
  26.                         android:valueType="floatType"/>
  27.     </set>
  28. </item>
  29. </selector>
定義了翻轉的效果的xml,

配置兩種方式:

1.layout:android:stateListAnimator屬性將其分配給你的檢視,

效果如下:


當然動畫任你自己定義,如果只定義Z軸的話也可以輕鬆的實現此效果:


類讓你去建立drawable資源,該資源在相關聯的檢視的狀態更改時展示動畫。一些Android5.0中的系統控制元件使用這些預設的動畫。下面的例子顯示瞭如何定義一個作為XML資源:

[html] view plaincopyprint?
  1. <!-- res/drawable/myanimstatedrawable.xml -->
  2. <animated-selector
  3.     xmlns:android="http://schemas.android.com/apk/res/android">
  4. <!-- provide a different drawable for each state-->
  5.     <itemandroid:id="@+id/pressed"android:drawable="@drawable/drawableP"
  6.         android:state_pressed="true"/>
  7.     <

    相關推薦

    Android 5.0學習動畫

    前言 使用者跟你的App進行互動時,Material Design中的動畫給予使用者動作的反饋和提供視覺的一致感。 包括之前我學習過的: 除我們已經學習過的動畫之外,Material Design還給我們提供了什麼動畫? Touch feedback(觸控反饋)Rev

    Android 5.0學習Activity過渡動畫

    前言 Activity Transition: 提供了三種Transition型別: 進入:一個進入的過渡(動畫)決定activity中的所有的檢視怎麼進入螢幕。退出:一個退出的過渡(動畫)決定一個activity中的所有檢視怎麼退出螢幕。 共享元素:一個共享元素

    Android 5.0學習Activity共享元素過渡動畫

    轉自:http://blog.csdn.net/ljx19900116/article/details/41806889 前言 Activity Transition: 提供了三種Transition型別: 進入:一個進入的過渡(動畫)決定activity中的

    Android 5.0+高級動畫開發 矢量圖動畫 軌跡動畫 路徑變換

    Android 第1章 課程介紹為了成就更多高逼格的人才,我專門整理了Android5.0以後主推的實現酷炫動畫的新技術,教你掌握實現動畫的高逼格技巧。課程中我會詳細講解每個動畫效果實現的原理和所用的技術,並帶你一步一步的實現每個動畫效果,讓你在學完本次課程後,能夠舉一反三,再也不必擔心設計MM的設計你沒法實

    Android學習Android 5.0分享動畫實現微信點選全屏效果

    Android5.0過渡動畫,請看 今天用分享動畫實現微信點選全屏效果 本文原始碼下載地址 peizhi 配置 build.gradle: compile 'com.android.support:recyclerview-v7:23.

    Android學習動畫總結(一)

    寫在前面:本文是根據hencoder提供的教程寫的總結。HenCoder https://hencoder.com。        Android裡動畫可以分為兩類:Animation和Transition,其中Animation又可以分為View Animation和Pr

    Android學習動畫總結(二)

    寫在前面:本文是根據hencoder提供的教程寫的總結。HenCoder https://hencoder.com。      關於ObjectAnimator可以用ofInt()來做整數的屬性動畫和ofFloat()來做小數的屬性動畫。當需要對其他型別的屬性來做動畫就需要

    Android實戰技巧九:最新Android開發環境(Eclipse+ADT+Android 5.0

    一、一切由執行時錯誤引起dalvikvm Could not find class '引用包.類', referenced from method... 其實在編譯時也會見到如下錯誤:       [dx]        [dx] trouble processing:   

    Android開發者福利--------Android 5.0 API

    Android 5.0 API Android 5.0 (LOLLIPOP) 為使用者和應用開發者提供了新功能。本文旨在介紹其中最值得關注的新 API。 如果您有已釋出的應用,請務必看一看 Android 5.0 行為變更,瞭解您的應用應該考慮的變化。即使您不使用

    Android 5.0 之後動畫摘要

    1   Android 5.0  轉場動畫 21+              首要工作:在RES檔案下建立transition檔案,在該資料夾下定義介面轉場動畫和共享元素的動畫。在你的style中設定

    android 5.0cardview

    CardView提供了一個預設的elevation(以為CardView的Z軸陰影)和圓角角度 首先我們需要在res/values/attrs中定義屬性 <?xml version="1.0" encoding="utf-8"?> <resources&

    React NativeAndroid 5.0以下系統WebView訪問https頁面變成空白頁

    在我們的React Native專案中,需要開發一個tab頁面專門配置三方h5連結,供使用者瀏覽。自動化測試:Android 5.0以下系統此tab頁面為空白頁面。看效果: 而我們去檢視這個三方的

    Android 5.0核心和原始碼學習(3)——SystemServer啟動了什麼服務?

    /**入口 * The main entry point from zygote. */ public static void main(String[] args) { new SystemServer().run(); } /**

    swift2.0學習拓展

    swift 方法 post var nes while code 算法 ive 拓展:和oc的拓展方法功能差點兒相同。就是給已經存在的類,結構體。枚舉,協議類型添加新的方法 拓展語法: 用extensionkeyword聲明: extension SomeTyp

    Python自動化3.0-------學習路-------第一個程序用戶登錄!

    hide lap 標記 之路 判斷 () exit isp 互信 一、用戶登錄程序 知識點:1.input() 2.while 循環 3.fot 循環

    Python自動化3.0-------學習路-------模塊初識!

    div 函數 傳遞 情況 必須 sys 先來 存在 argv 模塊初識   Python的強大之處在於他有非常豐富和強大的標準庫和第三方庫,幾乎你想實現的任何功能都有相應的Python庫支持,以後的課程中會深入講解常用到的各種庫,現在,我們先來象征性的學2個簡單的

    Python自動化3.0-------學習路------日期和時間!

    unix dst python自動化 相關 http -a 年份 字符串 cti Python 日期和時間 Python 程序能用很多方式處理日期和時間,轉換日期格式是一個常見的功能。 Python 提供了一個 time 和 calendar 模塊可以用於格式化日期和時間。

    Python自動化3.0-------學習路-------函數!

    rgs 未命名 ack 結果 string 提示 mutable tab 外部 Python 函數 函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。

    Enterprise Library 5.0 學習筆記

    數據 dsm tar ng- one pop releases 緩存 最新版 近期了解了微軟提供的企業開發框架Enterprise Library,眼下最新版本號是6.0,可是不支持FW3.5。所以就學習了5.0的版本號,EL5.0支持FW3.5和4

    修復android 5.0 Xutils的框架問題retry error, curr request is null

    top ims 訂閱 height trac ber request ext key Android 5.0手機對xUtils-2.6.13.jar請求時會出現retry error, curr request is null 情況, 修復解決方式: