freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于安卓的繪圖軟件開發(fā)與設(shè)計論文-閱讀頁

2024-11-28 04:47本頁面
  

【正文】 觸位置的筆觸的透明度,rgba指向MyPaintFixedTiledSurface中需要繪制mask位置的起始位置,MyPaintFixedTiledSurface包含當(dāng)前畫布的R、G、B三個顏色分量和A透明度分量。opacity為預(yù)設(shè)筆觸透明度。bottom = 1topAlphac) 按照以下兩個算法將mask區(qū)域的顏色和對應(yīng)畫布區(qū)域的顏色進(jìn)行blend:resultAlpha = topAlpha*color_a + bottomAlpha*resultColor = topAlpha*color_a* maskColor + * rgbaColor:圖 Normal_and_Eraser混合算法如果Normal_and_Eraser模式中參數(shù)color_a為不透明的,即值為1時,混合模式就成為Normal。 本章小結(jié) 本章主要介紹了MyPaint筆刷引擎的工作原理,分析出一個筆畫的繪制過程,其實是線性的連續(xù)繪制一系列筆觸的過程,中間插入的筆觸的不同形態(tài)和位置會決定最終的筆刷效果。由于MyPaint使用的是uint16_t代表一個像素中的一個通道,它占用2個字節(jié),而Android中一個像素的一個通道為uint8_t,占用一個字節(jié),格式無法兼容。24浙江大學(xué)碩士學(xué)位論文 第4章 Error! No text of specified style in document.第4章 MyPaint筆刷引擎的Android版本移植 Android版本改寫原因由于在MyPaint在渲染一個筆觸時使用了OpenMP多線程編程技術(shù),而Android底層編譯技術(shù)不支持OpenMP,導(dǎo)致直接使用MyPaint筆刷引擎享受不到多線程的好處。所以進(jìn)行MyPaint筆刷引擎的Android版本改寫。 MyPaintFixedTiledSurface的移植在MyPaint中MyPaintFixedTiledSurface主要用于維護(hù)當(dāng)前畫布中的數(shù)據(jù),和如何繪制一個筆觸,且使用了基于tile繪制筆觸的機(jī)制。 View介紹Android視圖(View)是一個矩形區(qū)域,它負(fù)責(zé)這個區(qū)域里的繪制和事件處理[9]。它Android的一個超類,這個類幾乎包含了所有的屏幕類型。在使用View作為我們的繪制區(qū)域時,我們需要重載其主要的兩個回調(diào)方法onTouchEvent和onDraw。其函數(shù)原型為:public boolean onTouchEvent(MotionEvent event)當(dāng)用戶手指觸摸到屏幕上該View區(qū)域時,該方法會被調(diào)用,我們可以從回調(diào)函數(shù)的參數(shù)event的getAction()方法中中得到當(dāng)前觸摸事件的一些狀態(tài):a) ()。c) MotionEvent. ACTION_UP表示當(dāng)前手指剛剛離開View區(qū)域。2. onDraw在Android中如果該View需要顯示屏幕上時,系統(tǒng)會通過onDraw()回調(diào)方法將該View繪制到屏幕上。onDraw()的函數(shù)原型如下:protected void onDraw(Canvas canvas)當(dāng)系統(tǒng)調(diào)用onDraw()時我們會到Canvas類,Canvas翻譯成中文為畫布,它可以用來繪制一系列圖形、形狀,如圓,橢圓,正方形等,它結(jié)合Android中Bitmap類和Matrix類還可以繪制位圖圖像。接下來將介紹如何實現(xiàn)MyPaintFixedTiledSurface的功能。2. drawCanvas為Canvas類型的成員變量,用于繪制筆觸。4. init()方法用于初始化Surface中所需的成員變量。onDraw()用于將bitmap繪制到手機(jī)屏幕上,可以更新當(dāng)前顯示的畫布。6. draw_dab()方法用于如何渲染出一個MyPaint中筆觸效果,以及將其繪制到bitmap中去。在Android中,系統(tǒng)提供了RadialGradient和Paint兩個類Android中提供了Shader類專門用來渲染圖像以及一些幾何圖形,Shader下面包括幾個直接子類,分別是BitmapShader、ComposeShader、LinearGradient、RadialGradient、SweepGradient。這里我們將主要使用RadialGradient來實現(xiàn)筆觸的透明度漸變效果。當(dāng)然,用不同的渲染時需要構(gòu)建不同的對象。但是由于RadialGradient只能創(chuàng)建出線性漸變,而不能創(chuàng)建出相應(yīng)的曲線漸變,筆觸的透明度和離中心距離d的相對關(guān)系并不是線性的,所以我們需要采樣出多個線性漸變來替代原生筆觸的效果。所以綜上所述,在小于hardness時,采樣5個點來進(jìn)行環(huán)形的線性漸變,個數(shù)可更具精度需要來自定義,在大于hardness時,由于幾乎成線性狀態(tài),直接采用一個點來進(jìn)行處理。draw_dab()的實現(xiàn)過程如下:1. 根據(jù)采樣出來的顏色數(shù)組創(chuàng)建名為localRadialGradient的RadialGradient,并將localRadialGradient設(shè)置給Paint,在繪制時使用該Paint對象來進(jìn)行渲染。3. 創(chuàng)建用于繪制筆觸所需的Btimap和Canvas,并設(shè)置相應(yīng)Matrix來對筆觸進(jìn)行壓縮和旋轉(zhuǎn)。 (true)。 RectF oval2 = new RectF()。 = radius*2。 = radius*2。Canvas tmpCanvas = new Canvas(tmpBitmap)。(1, aspect_ratio)。(angle, radius, radius)。(m)。 ()。5. 回收渲染過程中創(chuàng)建的臨時使用的bitmap。 接下來我們需要實現(xiàn)get_color()方法來實現(xiàn)取色功能。實現(xiàn)get_color()方法即可以將筆觸區(qū)域的顏色進(jìn)行加權(quán)平均計算,返回的顏色就是我們所需的顏色。 MyPaintBrush類的改寫在MyPaint中MyPaintBrush的作用是解析json格式的筆刷文件中的參數(shù),和根據(jù)用戶的輸入去實時更新筆刷的參數(shù)。在MyBrush中除了解析Json格式的筆刷數(shù)據(jù)和原始的MyPaintBrush的方法有不同,其他處理過程沒有太大出處。 單例模式在整個繪圖軟件中,正在使用的筆刷只有一個,不同的筆刷只是不同的參數(shù)而已,所以為了提高程序的健壯性,本文使用設(shè)計模式中的單例模式,將MyBrush設(shè)計成一個單例。實現(xiàn)單例模式的思路是:一個類能返回對象一個引用(永遠(yuǎn)是同一個)和一個獲得該實例的方法(必須是靜態(tài)方法,通常使用getInstance這個名稱)[12]。在本文中,將MyPaint的構(gòu)造函數(shù)設(shè)成私有,創(chuàng)建靜態(tài)方法getBrush()來獲取當(dāng)前筆刷的實例。 return mbrush。Android同時也提供了res目錄存放一些圖片等資源文件。而assets下的文件則不會,引用時需要值明相應(yīng)的路徑和文件名。在本文中,我們將預(yù)設(shè)的一些json格式的筆刷文件保存在assets文件夾下,在需要調(diào)用該筆刷時,把相應(yīng)的筆刷文件讀入內(nèi)存,進(jìn)行json格式的解析,解析出來的結(jié)果保存到相應(yīng)的數(shù)組中去。1. 先在當(dāng)前的Activity里面調(diào)用getAssets()來獲取Assetmanager引用。3. 由于解析Json格式需要String格式信息,需要將InputStream轉(zhuǎn)換成String格式。 Json格式介紹在MyPaint中筆刷參數(shù)定義在JSON(JavaScript Object Notation)格式的文件內(nèi),我們需要去對其進(jìn)行解析。在MyPaint中筆刷其中一個參數(shù)定義如下:opaque: { base_value: , inputs: { pressure: [ [ , ], [ , ], [ , ], [ , ] ] } }, 上式中“opaque”為一個鍵,它的值為一個對象。對應(yīng)解析這種層層包含關(guān)系的json格式我們需要進(jìn)行一層層解析。 實現(xiàn)結(jié)果分析對比在進(jìn)行MyPaint筆刷引擎Android版本移植后,可以很大程度上還原出原始版本的筆刷效果,但是由于筆觸渲染沒有使用多線程技術(shù)和使用Android原生API進(jìn)行繪制,繪圖性能不如原始那么迅速。可以滿足繪畫需求。由實現(xiàn)結(jié)果可以看出,對于hardness較高的筆刷可以很好的復(fù)制出MyPaint的效果,但對于hardness較低的筆刷會顯得筆觸的過度不是很自然。主要的性能損失在于沒有使用多線程,對筆觸中的Bitmap數(shù)據(jù)進(jìn)行多線程處理,所以當(dāng)筆刷的半徑很大時,快速繪制具有一定延遲。33浙江大學(xué)碩士學(xué)位論文 第5章Error! No text of specified style in document.第5章 繪圖軟件應(yīng)用界面開發(fā)設(shè)計與實現(xiàn)上一章討論了MyPaint引擎的改寫,本章將研究Android應(yīng)用層的開發(fā),并實現(xiàn)繪圖軟件的交互界面。 繪圖軟件的功能模塊根據(jù)繪圖軟件的一般需求和上文中介紹Android開發(fā)的原則,我們需要創(chuàng)建一個主Activity用來呈現(xiàn)我們的繪圖應(yīng)用程序。: 圖 繪圖軟件功能模塊圖,下文將主要進(jìn)行各個模塊的設(shè)計和實現(xiàn)。根據(jù)MVC(ModelViewController)開發(fā)原則,UI部分應(yīng)該與程序邏輯分離。由于Android設(shè)備的差異性很大,設(shè)備的屏幕大小、分辨率都有差異,為讓編寫的控件可以適配不同的設(shè)備,我們需要根據(jù)控件的作用使用合適的布局方式。(1) 線性布局 線性布局(Linearlayout)按照垂直或者水平的順序依次排列子元素,每一個子元素都位于前一個元素之后。如果搭建兩行兩列的結(jié)構(gòu),通常的方式是先垂直排列兩個元素,每一個元素里再包含一個LinearLayout進(jìn)行水平排列。(2) 相對布局 相對布局(RelativeLayout)按照各子元素之間的位置關(guān)系完成布局。例如android:layout_below, android:layout_above等。這里需要注意在指定位置關(guān)系時,引用的ID必須在引用之前,先被定義,否則將出現(xiàn)異常。(3) 絕對布局 絕對布局(AbsoluteLayout)是絕對位置布局。屏幕左上角為坐標(biāo)原點(0,0),第一個0代表橫坐標(biāo),向右移動此值增大,第二個0代表縱坐標(biāo),向下移動,此值增大。在實際開發(fā)中,通常不建議采用此布局格式,因為他的界面布局過于死板,不能適應(yīng)多種不同大小、分辨率的屏幕。一個TableLayout由許多TableRow組成,一個TableRow就代表TableLayout中的一行。所以它的子元素都是橫向排列,并且寬高一致的。在TableRow中,單元格可以為空,但是不能跨列。 在筆刷選擇控件中,我們使用線性布局來布局我們的筆刷,每個筆刷成線性排列。 筆刷按鈕會有兩種狀態(tài),一種是普通的狀態(tài),另一種是背景高亮的狀態(tài),在該筆刷按鈕被按下時,背景成高亮狀態(tài),表示該按鈕被按下。 首先Android的selector是在drawable文件夾下創(chuàng)建的xml格式文件,將筆刷普通狀態(tài)的背景圖片和按下狀態(tài)的背景圖片放入res/drawable目錄下,接著編寫selector文件,根據(jù)自己需要的狀態(tài)來使用相應(yīng)的圖片。將android:orientation屬性設(shè)置成為horizontal,表示該線性布局為水平排列。這樣我們的筆刷選擇器就可以實現(xiàn)了,:圖 筆刷選擇模塊實現(xiàn)效果圖 顏色選取模塊設(shè)計在繪圖軟件中,我們有需要更換筆刷的顏色的需求,本節(jié)主要介紹顏色選取模塊的設(shè)計。該模塊的實現(xiàn)步驟如下:1. 創(chuàng)建ColorPicker類,該類繼承自Android系統(tǒng)的View控件。使用該顏色數(shù)組創(chuàng)建SweepGradient,并將SweepGradient 設(shè)置到Paint中,在繪制該圖形時使用該Paint即可達(dá)到所需效果。 該顏色數(shù)組表示顏色從紅色、藍(lán)色、綠色、黃色進(jìn)行線性漸變。4. 重載View的onTouchEvent方法,分析用戶在取色環(huán)上觸摸的位置和角度,當(dāng)用戶觸摸到中心實心圓時,表示選中該顏色,并將顏色設(shè)置給當(dāng)前的筆刷。每當(dāng)onTouchEvent被系統(tǒng)調(diào)用時,使用invalidate()方法去請求當(dāng)前View去刷新界面,更新中心實心圓的顏色。 筆刷屬性調(diào)節(jié)模塊設(shè)計筆刷屬性調(diào)節(jié)模塊是由兩個拖動條構(gòu)成,一個用于改變筆刷大小,一個擁有改變筆刷透明度。在Android中我們可以繼承系統(tǒng)的SeekBar來實現(xiàn)自定義的拖動條。2. 由于筆刷的大小和透明度有限制我們需要設(shè)置Slider的最大值和最小值接口,方便外部調(diào)用。3. 由于拖動條是可以被用戶所控制,我們需要為其添加名為OnSeekBarChangerListener的監(jiān)聽器,來監(jiān)聽拖動條的變化,實時的將變化后的參數(shù)傳入筆刷更新相應(yīng)的參數(shù)。:圖 筆刷屬性條件模塊圖 繪圖Activity設(shè)計各個模塊設(shè)計完畢之后,我們需要創(chuàng)建主Activity來呈現(xiàn)我們的
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1