Android之實現滑動的七種方法總結
在android開發中,滑動對一個app來說,是非常重要的,流暢的滑動操作,能夠給使用者帶來用好的體驗,那麼本次就來講講android中實現滑動有哪些方式。其實滑動一個View,本質上是移動一個View,改變其當前所屬的位置,要實現View的滑動,就必須監聽使用者觸控的事件,且獲取事件傳入的座標值,從而動畫的改變位置而實現滑動。
*layout方法
*offsetLetfAndRight()與offsetTopAndBottom()
*LayoutParams
*scrollTo與scrollBy
*Scroller
*屬性動畫
*ViewDragHelper
android座標系
首先要知道android的座標系與我們平常學習的座標系是不一樣的,在android中是將左上方作為座標原點,向右為x抽正方向,向下為y抽正方向,像在觸控事件中,getRawX(),getRawY()獲取到的就是Android座標中的座標.
檢視座標系
android開發中除了上面的這種座標以外,還有一種座標,叫檢視座標系,他的原點不在是螢幕左上方,而是以父佈局坐上角為座標原點,像在觸控事件中,getX(),getY()獲取到的就是檢視座標中的座標.
觸控事件–MotionEvent
觸控事件MotionEvent在使用者互動中,有非常重要的作用,因此必須要掌握他,我們先來看看Motievent中封裝的一些常用的觸控事件常亮:
//單點觸控按下動作 public static final int ACTION_DOWN = 0; //單點觸控離開動作 public static final int ACTION_UP = 1; //觸控點移動動作 public static final int ACTION_MOVE = 2; //觸控動作取消 public static final int ACTION_CANCEL = 3; //觸控動作超出邊界 public static final int ACTION_OUTSIDE = 4; //多點觸控按下動作 public static final int ACTION_POINTER_DOWN = 5; //多點觸控離開動作 public static final int ACTION_POINTER_UP = 6;
以上是比較常用的一些觸控事件,通常情況下,我們會在OnTouchEvent(MotionEvent event)方法中通過event.getAction()方法來獲取觸控事件的型別,其程式碼模式如下:
@Overridepublic boolean onTouchEvent(MotionEvent event){ //獲取當前輸入點的座標,(檢視座標) float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //處理輸入按下事件 break; case MotionEvent.ACTION_MOVE: //處理輸入的移動事件 break; case MotionEvent.ACTION_UP: //處理輸入的離開事件 break; } return true; //注意,這裡必須返回true,否則只能響應按下事件}
以上只是一個空殼的架構,遇到的具體的場景,也有可能會新增多其他事件,或是用不到這麼多事件等等,要根據實際情況來處理。在介紹如何實現滑動之前先來看看android中給我們提供了那些常用的獲取座標值,相對距離等的方法,主要是有以下兩個類別:
-
View 提供的獲取座標方法
getTop(): 獲取到的是View自身的頂邊到其父佈局頂邊的距離
getBottom(): 獲取到的是View自身的底邊到其父佈局頂邊的距離
getLeft(): 獲取到的是View自身的左邊到其父佈局左邊的距離
getRight(): 獲取到的是View自身的右邊到其父佈局左邊的距離
-
MotionEvent提供的方法
getX(): 獲取點選事件距離控制元件左邊的距離,即檢視座標
getY(): 獲取點選事件距離控制元件頂邊的距離,即檢視座標
getRawX(): 獲取點選事件距離整個螢幕左邊的距離,即絕對座標
getRawY(): 獲取點選事件距離整個螢幕頂邊的距離,即絕對座標
介紹上面一些基本的知識點後,下面我們就來進入正題了,android中實現滑動的其中方法:
實現滑動的7種方法
其實不管是哪種滑動,他們的基本思路是不變的,都是:當觸控View時,系統記下當前的觸控座標;當手指移動時,系統記下移動後的觸控點座標,從而獲得相對前一個點的偏移量,通過偏移量來修改View的座標,並不斷的更新,重複此動作,即可實現滑動的過程。
首先我們先來定義一個View,並置於LinearLayout中,我們的目的是要實現View隨著我們手指的滑動而滑動,佈局程式碼如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><com.liaojh.scrolldemo.DragView android:layout_width="100dp" android:layout_height="100dp" android:background="#88ffffff"/></LinearLayout>
layout方法
我們知道,在進行View繪製時,會呼叫layout()方法來設定View的顯示位置,而layout方法是通過left,top,right,bottom這四個引數來確定View的位置的,所以我們可以通過修改這四個引數的值,從而修改View的位置。首先我們在onTouchEvent方法中獲取觸控點的座標:
float x = event.getX();float y = event.getY();
接著在ACTION_DOWN的時候記下觸控點的座標值:
case MotionEvent.ACTION_DOWN: //記錄按下觸控點的位置 mLastX = x; mLastY = y; break;
最後在ACTION_MOVE的時候計算出偏移量,且將偏移量作用到layout方法中:
case MotionEvent.ACTION_MOVE: //計算偏移量(此次座標值-上次觸控點座標值) int offSetX = (int) (x - mLastX); int offSetY = (int) (y - mLastY); //在當前left,right,top.bottom的基礎上加上偏移量 layout(getLeft() + offSetX, getTop() + offSetY, getRight() + offSetX, getBottom() + offSetY ); break;
這樣每次在手指移動的時候,都會呼叫layout方法重新更新佈局,從而達到移動的效果,完整程式碼如下:
package com.liaojh.scrolldemo;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * @author LiaoJH * @DATE 15/11/7 * @VERSION 1.0 * @DESC TODO */public class DragView extends View{ private float mLastX; private float mLastY; public DragView(Context context) { this(context, null); }public DragView(Context context, AttributeSet attrs){ this(context, attrs, 0);}public DragView(Context context, AttributeSet attrs, int defStyleAttr){ super(context, attrs, defStyleAttr);}@Overridepublic boolean onTouchEvent(MotionEvent event){ //獲取當前輸入點的座標,(檢視座標) float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //記錄按下觸控點的位置 mLastX = x; mLastY = y; break; case MotionEvent.ACTION_MOVE: //計算偏移量(此次座標值-上次觸控點座標值) int offSetX = (int) (x - mLastX); int offSetY = (int) (y - mLastY); //在當前left,right,top.bottom的基礎上加上偏移量 layout(getLeft() + offSetX, getTop() + offSetY, getRight() + offSetX, getBottom() + offSetY ); break; } return true;}}
當然也可以使用getRawX(),getRawY()來獲取絕對座標,然後使用絕對座標來更新View的位置,但要注意,在每次執行完ACTION_MOVE的邏輯之後,一定要重新設定初始座標,這樣才能準確獲取偏移量,否則每次的偏移量都會加上View的父控制元件到螢幕頂邊的距離,從而不是真正的偏移量了。
@Overridepublic boolean onTouchEvent(MotionEvent event){ //獲取當前輸入點的座標,(絕對座標) float rawX = event.getRawX(); float rawY = event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //記錄按下觸控點的位置 mLastX = rawX; mLastY = rawY; break; case MotionEvent.ACTION_MOVE: //計算偏移量(此次座標值-上次觸控點座標值) int offSetX = (int) (rawX - mLastX); int offSetY = (int) (rawY - mLastY); //在當前left,right,top.bottom的基礎上加上偏移量 layout(getLeft() + offSetX, getTop() + offSetY, getRight() + offSetX, getBottom() + offSetY ); //重新設定初始位置的值 mLastX = rawX; mLastY = rawY; break; } return true;}
offsetLeftAndRight()與offsetTopAndBottom()
這個方法相當於系統提供了一個對左右,上下移動的API的封裝,在計算出偏移量之後,只需使用如下程式碼設定即可:
offsetLeftAndRight(offSetX); offsetTopAndBottom(offSetY);
偏移量的計算與上面一致,只是換了layout方法而已。
LayoutParams
LayoutParams儲存了一個View的佈局引數,因此可以在程式中通過動態的改變佈局的位置引數,也可以達到滑動的效果,程式碼如下:
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams(); lp.leftMargin = getLeft() + offSetX; lp.topMargin = getTop() + offSetY; setLayoutParams(lp);
使用此方式時需要特別注意:通過getLayoutParams()獲取LayoutParams時,需要根據View所在的父佈局的型別來設定不同的型別,比如這裡,View所在的父佈局是LinearLayout,所以可以強轉成LinearLayout.LayoutParams。
在通過改變LayoutParams來改變View的位置時,通常改變的是這個View的Margin屬性,其實除了LayoutParams之外,我們有時候還可以使用ViewGroup.MarginLayoutParams來改變View的位置,程式碼如下:
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) getLayoutParams();lp.leftMargin = getLeft() + offSetX;lp.topMargin = getTop() + offSetY;setLayoutParams(lp);//使用這種方式的好處就是不用考慮父佈局型別
scrollTo與scrollBy
在一個View中,系統提供了scrollTo與scrollBy兩種方式來改變一個View的位置,其中scrollTo(x,y)表示移動到一個具體的座標點(x,y),而scrollBy(x,y)表示移動的增量。與前面幾種計算偏移量相同,使用scrollBy來移動View,程式碼如下:
scrollBy(offSetX,offSetY);
然後我們拖動View,發現View並沒有移動,這是為雜呢?其實,方法沒有錯,view也的確移動了,只是他移動的不是我們想要的東西。scrollTo,scrollBy方法移動的是view的content,即讓view的內容移動,如果是在ViewGroup中使用scrollTo,scrollBy方法,那麼移動的將是所有的子View,而如果在View中使用的話,就是view的內容,所以我們需要改一下我們之前的程式碼:
((View)getParent()).scrollBy(offSetX, offSetY);
這次是可以滑動了,但是我們發現,滑動的效果跟我們想象的不一樣,完全相反了,這又是為什麼呢?其實這是因為android中對於移動參考系選擇的不同從而實現這樣的效果,而我們想要實現我們滑動的效果,只需將偏移量設定為負值即可,程式碼如下:
((View) getParent()).scrollBy(-offSetX, -offSetY);
同樣的在使用絕對座標時,使用scrollTo也可以達到這樣的效果。
scroller
如果讓一個View向右移動200的距離,使用上面的方式,大家應該發現了一個問題,就是移動都是瞬間完成的,沒有那種慢慢平滑的感覺,所以呢,android就給我們提供了一個類,叫scroller類,使用該類就可以實現像動畫一樣平滑的效果。
其實它實現的原理跟前面的scrooTo,scrollBy方法實現view的滑動原理類似,它是將ACTION_MOVE移動的一段位移劃分成N段小的偏移量,然後再每一個偏移量裡面使用scrollBy方法來實現view的瞬間移動,這樣在整體的效果上就實現了平滑的效果,說白了就是利用人眼的視覺暫留特性。
下面我們就來實現這麼一個例子,移動view到某個位置,鬆開手指,view都吸附到左邊位置,一般來說,使用Scroller實現滑動,需經過以下幾個步驟:
-
初始化Scroller
//初始化Scroller,使用預設的滑動時長與插值器mScroller = new Scroller(context);
-
重寫computeScroll()方法
該方法是Scroller類的核心,系統會在繪製View的時候呼叫draw()方法中呼叫該方法,這個方法本質上是使用scrollTo方法,通過Scroller類可以獲取到當前的滾動值,這樣我們就可以實現平滑一定的效果了,一般模板程式碼如下:
@Overridepublic void computeScroll(){ super.computeScroll(); //判斷Scroller是否執行完成 if (mScroller.computeScrollOffset()) { ((View)getParent()).scrollTo( mScroller.getCurrX(), mScroller.getCurrY() ); //呼叫invalidate()computeScroll()方法 invalidate(); }}
Scroller類提供中的方法:
computeScrollOffset(): 判斷是否完成了真個滑動getCurrX(): 獲取在x抽方向上當前滑動的距離getCurrY(): 獲取在y抽方向上當前滑動的距離
-
startScroll開啟滑動
最後在需要使用平滑移動的事件中,使用Scroller類的startScroll()方法來開啟滑動過程,startScroller()方法有兩個過載的方法:
– public void startScroll(int startX, int startY, int dx, int dy)
– public void startScroll(int startX, int startY, int dx, int dy, int duration)
可以看到他們的區別只是多了duration這個引數,而這個是滑動的時長,如果沒有使用預設時長,預設是250毫秒,而其他四個座標則表示起始座標與偏移量,可以通過getScrollX(),getScrollY()來獲取父檢視中content所滑動到的點的距離,不過要注意這個值的正負,它與scrollBy,scrollTo中說的是一樣的。經過上面這三步,我們就可以實現Scroller的平滑一定了。
繼續上面的例子,我們可以在onTouchEvent方法中監聽ACTION_UP事件動作,呼叫startScroll方法,其程式碼如下:
case MotionEvent.ACTION_UP: //第三步 //當手指離開時,執行滑動過程 ViewGroup viewGroup = (ViewGroup) getParent(); mScroller.startScroll( viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(), 0, 800 ); //重新整理佈局,從而呼叫computeScroll方法 invalidate(); break;
屬相動畫
使用屬性動畫同樣可以控制一個View的滑動,下面使用屬相動畫來實現上邊的效果(關於屬相動畫,請關注其他的博文),程式碼如下:
case MotionEvent.ACTION_UP: ViewGroup viewGroup = (ViewGroup) getParent(); //屬性動畫執行滑動 ObjectAnimator.ofFloat(this, "translationX", viewGroup.getScrollX()).setDuration(500) .start(); break;
ViewDragHelper
一看這個類的名字,我們就知道他是與拖拽有關的,猜的沒錯,通過這個類我們基本可以實現各種不同的滑動,拖放效果,他是非常強大的一個類,但是它也是最為複雜的,但是不要慌,只要你不斷的練習,就可以數量的掌握它的使用技巧。下面我們使用這個類來時實現類似於QQ滑動側邊欄的效果,相信廣大朋友們多與這個現象是很熟悉的吧。
先來看看使用的步驟是如何的:
-
初始化ViewDragHelper
ViewDragHelper這個類通常是定義在一個ViewGroup的內部,並通過靜態方法進行初始化,程式碼如下:
//初始化ViewDragHelper
viewDragHelper = ViewDragHelper.create(this,callback);它的第一個引數是要監聽的View,通常是一個ViewGroup,第二個引數是一個Callback回撥,它是整個ViewDragHelper的邏輯核心,後面進行具體介紹。
-
攔截事件
重寫攔截事件onInterceptTouchEvent與onTouchEvent方法,將事件傳遞交給ViewDragHelper進行處理,程式碼如下:
@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev){ //2. 將事件交給ViewDragHelper return viewDragHelper.shouldInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event){ //2. 將觸控事件傳遞給ViewDragHelper,不可少 viewDragHelper.processTouchEvent(event); return true;}
-
處理computeScroll()方法
前面我們在使用Scroller類的時候,重寫過該方法,在這裡我們也需要重寫該方法,因為ViewDragHelper內部也是使用Scroller類來實現的,程式碼如下:
//3. 重寫[email protected] void computeScroll(){ //持續平滑動畫 (高頻率呼叫) if (viewDragHelper.continueSettling(true)) // 如果返回true, 動畫還需要繼續執行 ViewCompat.postInvalidateOnAnimation(this);}
-
處理回撥Callback
通過如下程式碼建立一個Callback:
private ViewDragHelper.Callback callback = new ViewDragHelper.Callback(){ @Override //此方法中可以指定在建立ViewDragHelper時,引數ViewParent中的那些子View可以被移動 //根據返回結果決定當前child是否可以拖拽 // child 當前被拖拽的View // pointerId 區分多點觸控的id public boolean tryCaptureView(View child, int pointerId) { //如果當前觸控的view是mMainView時開始檢測 return mMainView == child; } @Override //水平方向的滑動 // 根據建議值 修正將要移動到的(橫向)位置 (重要) // 此時沒有發生真正的移動 public int clampViewPositionHorizontal(View child, int left, int dx) { //返回要滑動的距離,預設返回0,既不滑動 //引數參考clampViewPositionVertical f (child == mMainView) { if (left > 300) { left = 300; } if (left < 0) { left = 0; } } return left; } @Override //垂直方向的滑動 // 根據建議值 修正將要移動到的(縱向)位置 (重要) // 此時沒有發生真正的移動 public int clampViewPositionVertical(View child, int top, int dy) { //top : 垂直向上child滑動的距離, //dy: 表示比較前一次的增量,通常只需返回top即可,如果需要精確計算padding等屬性的話,就需要對left進行處理 return super.clampViewPositionVertical(child, top, dy); //0 }};
到這裡就可以拖拽mMainView移動了。
下面我們繼續來優化這個程式碼,還記得之前我們使用Scroller時,當手指離開屏幕後,子view會吸附到左邊位置,當時我們監聽ACTION_UP,然後呼叫startScroll來實現的,這裡我們使用ViewDragHelper來實現。
在ViewDragHelper.Callback中,系統提供了這麼一個方法—onViewReleased(),我們可以通過重寫這個方法,來實現之前的操作,當然這個方法內部也是通過Scroller來實現的,這也是為什麼我們要重寫computeScroll方法的原因,實現程式碼如下:
@Override //拖動結束時呼叫 public void onViewReleased(View releasedChild, float xvel, float yvel) { if (mMainView.getLeft() < 150) { // 觸發一個平滑動畫,關閉選單,相當於Scroll的startScroll方法 if (viewDragHelper.smoothSlideViewTo(mMainView, 0, 0)) { // 返回true代表還沒有移動到指定位置, 需要重新整理介面. // 引數傳this(child所在的ViewGroup) ViewCompat.postInvalidateOnAnimation(DragLayout.this); } } else { //開啟選單 if (viewDragHelper.smoothSlideViewTo(mMainView, 300, 0)) ; { ViewCompat.postInvalidateOnAnimation(DragLayout.this); } } super.onViewReleased(releasedChild, xvel, yvel); }
當滑動的距離小於150時,mMainView回到原來的位置,當大於150時,滑動到300的位置,相當於打開了mMenuView,而且滑動的時候是很平滑的。此外還有一些方法:
@Override public void onViewCaptured(View capturedChild, int activePointerId) { // 當capturedChild被捕獲時,呼叫. super.onViewCaptured(capturedChild, activePointerId); } @Override public int getViewHorizontalDragRange(View child) { // 返回拖拽的範圍, 不對拖拽進行真正的限制. 僅僅決定了動畫執行速度 return 300; } @Override //當View位置改變的時候, 處理要做的事情 (更新狀態, 伴隨動畫, 重繪介面) // 此時,View已經發生了位置的改變 public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { // changedView 改變位置的View // left 新的左邊值 // dx 水平方向變化量 super.onViewPositionChanged(changedView, left, top, dx, dy); }
說明:裡面還有很多關於處理各種事件方法的定義,如:
onViewCaptured():使用者觸控到view後回撥
onViewDragStateChanged(state):這個事件在拖拽狀態改變時回撥,比如:idle,dragging等狀態
onViewPositionChanged():這個是在位置改變的時候回撥,常用於滑動時伴隨動畫的實現效果等
對於裡面的方法,如果不知道什麼意思,則可以列印log,看看引數的意思。
總結
這裡介紹的就是android實現滑動的七種方法,至於使用哪一種好,就要結合具體的專案需求場景了,畢竟硬生生的實現這個效果,而不管使用者的使用體驗式不切實際的,這裡面個人覺得比較重要的是Scroller類的使用。屬性動畫以及ViewDragHelper類,特別是最後一個,也是最難最複雜的,但也是甩的最多的。
相關推薦
Android之實現滑動的七種方法總結
在android開發中,滑動對一個app來說,是非常重要的,流暢的滑動操作,能夠給使用者帶來用好的體驗,那麼本次就來講講android中實現滑動有哪些方式。其實滑動一個View,本質上是移動一個View,改變其當前所屬的位置,要實現View的滑動,就必須監聽使用者觸
Android之實現滑動開關元件
由於Android並未提供滑動開關之類的元件,所以我們需要自己去實現一個自定義的檢視元件來實現滑動開關效果。 這裡有一個示例程式碼,它包括三個類:開關元件檢視、狀態監聽介面、MainActivity 我們先來看看整個demo的效果圖: 我們先
Android按鈕實現的兩種方法
剛接觸Android開發,第一篇部落格,也就當做筆記吧, 這裡先說一個問題,在很多Android開發書中可能是版本太早的問題,都說res/layout下有一個main.xml檔案中放著排版資訊,但是個人在實際中見到的是res/menu下是main.xml中只有少量其他資訊,
實現滑動的七種方法(Android群英傳)
內容是博主照著書敲出來的,博主碼字挺辛苦的,轉載請註明出處,後序內容陸續會碼出。 當了解了Android座標系和觸控事件後,我們再來看看如何使用系統提供的API來實現動態地修改一個View的座標,即實現滑動效果。而不管採用哪一種方式,其實現的思想基本是一致
Android實現滑動的七種方法實踐
在講解滑動之前,要先熟悉一下安卓的座標系。安卓檢視有兩個座標系,一個是Android座標系,一個是檢視座標系。前者以螢幕的最左上角為原點,向右為X軸正方向,向下為Y軸正方向。後者以父檢視的左上角為原點,其它與前者一致。 而獲取座標的方法也可以分為兩類,View提供的
Android中實現滑動的七種方法
在Android中想要實現實現滑動有很多方法,這篇部落格將提供一些實現滑動的思路,希望可以幫助到有需要的人。 一、Android座標體系 在講解滑動之前,我們有必要簡單提一下Android的座標體系,因為滑動的實質就是座標的不斷改變,所以我
Android實現滑動的七種方法
1.layout方法 每次移動後,呼叫layout()方法對自己重新佈局從而達到移動的效果 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) e
Android 實現 View 滑動的七種方法
記錄下系統提供的 View 滑動的 API 方法。不管採用哪一種方式,本質的思想基本上都是一致的,當觸控 View 的時候,記錄下當前觸控點的座標,當手指移動的時候,記錄移動後的觸控點座標,從而獲取相對上一次座標點的偏移量,通過偏移量來修改 View 的座標,這
Android Scroll分析 (二) 教你使用七種方法實現滑動
實現滑動的基本思想是:當觸控View時,系統記下當前觸控點座標;當手指移動時,系統記下移動後的觸控點座標,從而獲取到相對於前一次座標點的偏移量,並通過偏移量來修改View的座標,這樣不斷重複,從而實現滑動過程. 2.1 Layout方法 在View進行繪
【字串反轉總結】Java中七種方法實現
演算法比較簡單,註釋就能說明問題,直接上程式碼! 方法一:(利用遞迴實現) public static String reverse1(String s) { int length = s.length(); if (length <= 1) retur
記錄Android中實現滑動的幾種方法
一、layou方法 程式碼示例如下,自定義一個view,在onTouchEvent()方法中計算手指滑動時的偏移量,呼叫view的layout()方法,在當前left、top、right、bottom上加上偏移量,實現view的滑動。 public clas
實現滑動的七種方法
週末,android群英傳與Android開發藝術探索兩本書到了,確實是適合android進階的好書, 以後書中學到的覺得不錯的內容會寫在這個模組。 今天介紹滑動的七種方式 基本思想: 當手指按下時,記下當前座標 lastX, last
JS實現陣列去重方法總結(三種常用方法)
方法一: 雙層迴圈,外層迴圈元素,內層迴圈時比較值 如果有相同的值則跳過,不相同則push進陣列 Array.prototype.distinct = function(){ var arr = this,result = [], i,j,len = arr.length; f
css實現兩欄佈局,左側固定寬,右側自適應的七種方法
一個面試會問的問題,如何實現兩個盒子,左側固定寬度,右側自適應。 下面是實現的其中方法: 1、利用 calc 計算寬度的方法 css程式碼如下: .box{overflow: hidden;height: 100px;margin: 10px 0;} .box&
七種方法實現Python抓取資料的視覺化
Python 的scientific stack(一個介紹Python科學計算包的網站)已經完全成熟,並且有各種各樣用例的庫,包括機器學習(連結:machine learning),資料分析(連結:data analysis)。資料視覺化是探索資料和清晰的解釋結果很重要的一部分,
Android自定義控制元件之實現滑動選擇開關
前言:今天我們仿照著Google給我們提供的Switch控制元件來進行一次模仿,自己動手打造一個可以換滑動圖片以及背景的圖片。 -----------------分割線--------------- 先看一下google提供的Switc控制元件: 其實用法很簡單就當普通的
JavaScript實現陣列去重方法總結(六種方法)
方法一:雙層迴圈,外層迴圈元素,內層迴圈時比較值如果有相同的值則跳過,不相同則push進陣列Array.prototype.distinct = function(){ var arr = this, result = [], i, j, len = arr
程式實現自我刪除的七種方法
//第一種 利用CREATEFILE函式的FILE_FLAG_DELETE_ON_CLOSE,標誌位實現 #include <windows.h> #include <tchar.h> int CommitSuicide(char *szCmdL
JavaScript實現陣列去重的七種方法
JS 實現陣列去重的七種方法 方法一 直接遍歷 首先準備一個備用空陣列,遍歷原始陣列,然後將新陣列中沒有的元素推進去 function unique(array) { var result = []; for (var i = 0, len = arra
SpringBoot實踐之---系統啟動載入實現的幾種方法init、servelt、CommandLineRunner
實際應用中,我們會有在專案服務啟動的時候就去載入一些資料或做一些事情這樣的需求。 方法一:CommandLineRunner 為了解決這樣的問題,Spring Boot 為我們提供了一個方法,通過實現介面 CommandLineRunner 來實現。很簡單,只需要一個類就可以