1. 程式人生 > >【移動開發】在Canvas上顯示動畫

【移動開發】在Canvas上顯示動畫

本文翻譯自《50 android hacks》

當自定義View的時候,可以利用Canvas給View新增一些動畫效果。

下面的例子,是在螢幕上繪製一個紅色的小方塊,這個小方塊會在螢幕上面“亂跳”。


知識點

使用到的知識點:

(1) 在View的子類的draw()中呼叫invalidate(),可以讓View物件一直保持重繪狀態,從而可以使Canvas一直處於繪畫過程中。

(2) Canvas的繪製功能,例如繪製Rect、Circle、Path等。

(3) 小方塊碰撞螢幕邊緣的演算法。

實現

小方塊檢視。

繼承View類,重寫onDraw()方法,並提供一些setter和getter方法,用於設定小方塊的屬性。判斷碰撞事件的邏輯在moveTo()方法中。程式碼如下:

public class Rectangle extends View {
  public static final int MAX_SIZE = 40;
  private static final int ALPHA = 255;
  private int mCoordX = 0;
  private int mCoordY = 0;
  private int mRealSize = 40;
  private int mSpeedX = 3;
  private int mSpeedY = 3;

  private boolean goRight = true;
  private boolean goDown = true;
  private DrawView mDrawView;

  private Paint mInnerPaint;
  private RectF mDrawRect;

  public Rectangle(Context context, DrawView drawView) {
    super(context);
    mDrawView = drawView;

    mInnerPaint = new Paint();

    mDrawRect = new RectF();

    /* Red is default */
    mInnerPaint.setARGB(ALPHA, 255, 0, 0);
    mInnerPaint.setAntiAlias(true);
  }

  public void setARGB(int a, int r, int g, int b) {
    mInnerPaint.setARGB(a, r, g, b);
  }

  public void setX(int newValue) {
    mCoordX = newValue;
  }

  public int getX() {
    return mCoordX;
  }

  public void setY(int newValue) {
    mCoordY = newValue;
  }

  public int getY() {
    return mCoordY;
  }

  public void move() {
    moveTo(mSpeedX, mSpeedY);
  }

  private void moveTo(int goX, int goY) {

    // check the borders, and set the direction if a border has reached
    if (mCoordX > (mDrawView.width - MAX_SIZE)) {
      goRight = false;
    }

    if (mCoordX < 0) {
      goRight = true;
    }

    if (mCoordY > (mDrawView.height - MAX_SIZE)) {
      goDown = false;
    }
    if (mCoordY < 0) {
      goDown = true;
    }

    // move the x and y
    if (goRight) {
      mCoordX += goX;
    } else {
      mCoordX -= goX;
    }
    if (goDown) {
      mCoordY += goY;
    } else {
      mCoordY -= goY;
    }

  }

  public int getSpeedX() {
    return mSpeedX;
  }

  public void setSpeedX(int speedX) {
    mSpeedX = speedX;
  }

  public int getmSpeedY() {
    return mSpeedY;
  }

  public void setSpeedY(int speedY) {
    mSpeedY = speedY;
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    mDrawRect.set(mCoordX, mCoordY, mCoordX + mRealSize, mCoordY
        + mRealSize);
    canvas.drawRoundRect(mDrawRect, 0, 0, mInnerPaint);

  }

  public void setSize(int newSize) {
    mRealSize = newSize;
  }

  public int getSize() {
    return mRealSize;
  }
}

外層檢視。

小方塊是一個獨立的檢視,這裡不直接把小方塊顯示在Actiity中,在它的外面又“包”了一層。程式碼如下:

public class DrawView extends View {
  private Rectangle mRectangle;
  public int width;
  public int height;

  public DrawView(Context context) {
    super(context);

    mRectangle = new Rectangle(context, this);
    mRectangle.setARGB(255, 255, 0, 0);
    mRectangle.setSpeedX(3);
    mRectangle.setSpeedY(3);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    invalidate();

    mRectangle.move();
    mRectangle.onDraw(canvas);
  }

}

主介面。

獲取螢幕的尺寸,並把相應的尺寸賦值給DrawView物件。最後,顯示DrawView物件。程式碼如下:

public class MainActivity extends Activity {

  private DrawView mDrawView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Display display = getWindowManager().getDefaultDisplay();
    mDrawView = new DrawView(this);
    mDrawView.height = display.getHeight();
    mDrawView.width = display.getWidth();

    setContentView(mDrawView);
  }
}

參考資料

相關推薦

移動開發Canvas顯示動畫

本文翻譯自《50 android hacks》當自定義View的時候,可以利用Canvas給View新增一些動畫效果。下面的例子,是在螢幕上繪製一個紅色的小方塊,這個小方塊會在螢幕上面“亂跳”。知識點使用到的知識點:(1) 在View的子類的draw()中呼叫invalida

移動開發關於一對一視訊聊天直播技術(七):直播雲 SDK 效能測試模

本篇是《一對一視訊直播技術詳解》系列的最後一篇直播雲 SDK 效能測試模型,SDK 的效能對最終 App 的影響非常大。SDK 版本迭代快速,每次釋出前都要進行系統的測試,測試要有比較一致的行為,要有效能模型作為理論基礎,對 SDK 的效能做量化評估。本文就是來探討影響 SDK 效能的指標並建立相應的效能模型

移動開發關於一對一視訊交友直播(五)延遲優化

6 月底釋出了一個針對視訊直播的實時流網路 LiveNet 和完整的直播雲解決方案,很多開發者對這個網路和解決方案的細節和使用場景非常感興趣。 結合實時流網路 LiveNet 和直播雲解決方案的實踐,我們用一系列文章,更系統化地介紹當下大熱的視訊直播各環節的關鍵技術,幫助視訊直播創業者們更全面、深入地瞭解視

移動開發關於一對一視訊交友技術原始碼(六)現代播放器原理

在上一篇延遲優化中,我們分享了不少簡單實用的調優技巧。本篇是《一對一視訊直播技術詳解》系列之六:現代播放器原理。 近年來,多平臺適配需求的增長導致了流媒體自適應位元速率播放的興起,這迫使 Web 和移動開發者們必須重新思考視訊技術的相關邏輯。首先,巨頭們分分發布了 HLS、HDS 和 Smooth Stre

移動開發iOS和Android不規則按鈕解決方案

【寫在前面】如果看完這篇部落格,對你有幫助的話,歡迎加入全棧技術交流群,群內不定時釋出熱門學習資料,也歡迎進行技術交流,對我的部落格有疑問也可以在群裡@我。《全棧技術交流群歡迎你》 好久沒有寫Android和iOS了,最近看看之前寫的專案,別忘了,2333 效果圖 簡單介紹一下介

Qt開發QT中顯示影象資料

一般影象資料都是以RGBRGBRGB……位元組流的方式(解碼完成後的原始影象流),我說成位元組流,那就表明R,G,B的值各佔一個位元組,在程式設計時表示的就是unsigned char * data。        我們先來看一下QT中的QImage物件。在載入data資料

Qt開發Qt中顯示影象的兩種方法對比

在Qt中處理圖片一般都要用到QImage類,但是QImage的物件不能夠直接顯示出來,要想能看到圖片,初步發現有兩種方法。 一、QImage轉QPixmap,然後用QLabel::setPixmap() image=new QImage("D:/Temp/XX.jpg

Canvas顯示動畫

如果想為自定義的UI控制元件新增動畫效果,會發現動畫相關的API是很有限的。那麼有沒有API可以直接向螢幕繪圖呢?答案是肯定的。Android提供了Canvas滿足這一要求。 在這個例子中,我們將以方塊在螢幕上彈跳為例分析如何使用Canvas類在螢幕上繪製圖形

iOS開發cell的內容重複

在iOS開發中,我們經常會重用單元格cell。在獲取cell之後,如果我們在cell之上新增其它控制元件的話,可能會導致下次重用此cell的時候會出現重複的內容,我們可以移除上次新增的子控制元件來防止重複。但是cell的子控制元件中還有一個UITableView

python安裝Windows安裝和創建python開發環境

path環境變量 -s cme iat img mba 增加 應用 jni 1. 在 windows10 上安裝python開發環境 Linux和Mac OS都自帶python環境,但是Windows沒有,需要自行安裝。 第1步:訪問 python官網,下載Windows

遊戲開發定時器迴圈播放動畫

//Windows視窗標頭檔案 #include <windows.h> //swprintf_s函式包含的標頭檔案 #include <tchar.h> //PlaySound函式包含的庫檔案 #pragma comment(lib,"winmm.lib") /

python安裝Windows安裝和建立python開發環境

1. 在 windows10 上安裝python開發環境 Linux和Mac OS都自帶python環境,但是Windows沒有,需要自行安裝。 第1步:訪問 python官網,下載Windows平臺下的安裝包 選擇下載3.X的版本,我選擇的是3.6.6的版本 雙擊下載完的檔案python-3.6.6-

移動開發與培訓Linux管理_Linux開發

1024超級勳章 授予原創文章總數達

iOS開發iOS移動端架構

引言:一個app的初始階段,必然是先滿足各種業務需求。然後,經過多次版本迭代之後,先前的由於急於滿足需求而導致的雜亂程式碼則會充斥整個專案。而此時,專案有了一定的規模,有了一定數量的開發人員,那麼為了達到快速迭代版本的需求,則是需要有一個強大的架構來支撐。

Android開發動畫彈出PopupWindow並使背景變暗

我們在平常的android應用開發過程中,當應用資料太多太繁雜時,通常都會通過分類篩選讓使用者更好的找到自己想要的資訊。因此利用PopupWindow或Dialog讓使用者快速選擇定位是一個很好的選擇。如我們想在美團上查詢附近有什麼電影院時: 點選按鈕彈出

OpenCV開發OpenCV:使用VideoCapture類進行視訊讀取和顯示

註釋比較詳盡,相信大家都能看得懂,這裡再做幾點補充: 1.由於原視訊是網路攝像頭採集的,所以有很多雪花點,在這裡進行了簡單的均值濾波處理。 2.雖然VideoCapture類中有grab(捕獲下一幀)和retrieve(對該幀進行解碼)操作,但是直接用read比較簡單。 3.get函式的功能很強大,

iOS開發UIWebView載入html時不顯示網路圖片解決辦法

NSString *html = @"<html><body><p>怎麼顯示網路圖片 <img src=\"http://p0.ifengimg.com/pmop/2017/1218/F9636BB16CC72EC34B5FCB78

網站開發在新浪SAE搭建一個部落格

1.訪問新浪SAE站點 http://sae.sina.com.cn/ 2.註冊新浪SAE 3.選擇應用倉庫 4.選擇WordPress 5.安裝WordPress 6.填寫二級域名 7.建立成功後,開啟站點 http://doitblog.sinaapp.co

Linux開發OpenCV在ARM-linux的移植過程遇到的問題4---共享庫中巢狀庫帶路徑已解決

【Linux開發】OpenCV在ARM-linux上的移植過程遇到的問題4—共享庫中巢狀庫帶路徑【已解決】 標籤:【Linux開發】 緊接著上一篇,我居然又嘗試了一下編譯opencv,主要是因為由於交叉編譯ARM-Linux,opencv,好像剛開始ma

Android開發圖形影象處理技術-實現Android動畫的兩種方式

在應用Android進行專案開發時,特別是在進行遊戲開發時,經常需要涉及動畫。Android中的動畫通常可以分為逐幀動畫(Frame Animation)和補間動畫(Tween Animation)兩種。下面將分別介紹這兩種動畫。 一.實現逐幀動畫(Frame Animat