【移動開發】在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