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

正文內(nèi)容

基于安卓的繪圖軟件開發(fā)與設(shè)計(jì)論文(文件)

2024-12-02 04:47 上一頁面

下一頁面
 

【正文】 為一個(gè)函數(shù)指針,其函數(shù)原型為:int mypaint_surface_draw_dab(MyPaintSurface *self, float x, float y, float radius, float color_r, float color_g, float color_b, float opaque, float hardness, float alpha_eraser, float aspect_ratio, float angle, float lock_alpha, float colorize )。在MyPaint中一共包含了42個(gè)筆刷參數(shù),這里主要介紹其中常用的部分參數(shù)意義,下文提到的筆觸概念將在下節(jié)中詳細(xì)介紹。4. offset_by_random:?jiǎn)蝹€(gè)筆觸的位置隨機(jī)偏移量。8. elliptical_dab_ratio:表示單個(gè)筆觸的寬和長(zhǎng)的比例。 RngDouble是一個(gè)隨機(jī)數(shù)生成器。在繪畫過程中,一個(gè)筆畫是由許多連續(xù)的筆觸構(gòu)成。:圖 hardness與opaque關(guān)系圖 ,d表示離筆觸中心點(diǎn)的距離,筆觸的透明度隨著離中心點(diǎn)的距離平方的變化呈兩段線性減小的改變。參數(shù)aspect_ration和angle被用來定義一個(gè)橢圓形的筆觸。計(jì)算橢圓形筆觸透明度的偽代碼如下: cs = cos(angle/360*2*pi)。 dd = (dyr*dyr + dxr*dxr) / (radius*radius)。:圖 橢圓形筆觸的繪畫效果 本節(jié)主要介紹了MyPaint的基本渲染單元——筆觸,以及它是如何被定義的。1. int mypaint_brush_stroke_to(MyPaintBrush *self, MyPaintSurface *surface, float x, float y, float pressure, float xtilt, float ytilt, double dtime);當(dāng)用戶在畫布上每次移動(dòng)時(shí),外部設(shè)備會(huì)有回調(diào)函數(shù)出發(fā),在每次系統(tǒng)回調(diào)這些函數(shù)時(shí)調(diào)用mypaint_brush_stroke_to這個(gè)方法,此方法的意義是將筆刷從上一次繪制的點(diǎn)繪制到當(dāng)前位置,形成一個(gè)筆畫。在一些PC桌面設(shè)備中,會(huì)有一些手繪板設(shè)備,當(dāng)用戶在繪畫過程中,會(huì)向系統(tǒng)提供當(dāng)前用戶繪畫時(shí)筆的壓力感應(yīng)參數(shù)。e) ditme為兩次接受到系統(tǒng)回調(diào)的時(shí)間間隔。a) step_dx、step_dy、step_dpressure表示需要當(dāng)前筆觸的x、y坐標(biāo)和筆壓。在MyPaint中,出于性能考慮,筆觸的坐標(biāo)、壓感、時(shí)間都是根據(jù)相鄰兩次系統(tǒng)回調(diào)時(shí)給出的參數(shù)進(jìn)行線性插值來進(jìn)行計(jì)算的。另一個(gè)作用是獲取畫布中當(dāng)前筆觸所在區(qū)域中畫布顏色的平均值,并根據(jù)需要將其應(yīng)用到下個(gè)筆觸的繪制中。程序中通過一些pragma配置即可由編譯器將程序并行化,當(dāng)選擇忽略這些參數(shù),或者編譯器不支持OpenMP的時(shí)候,代碼可以正常運(yùn)行,只是不能進(jìn)行多線程運(yùn)行。 在get_color時(shí)會(huì)根據(jù)筆觸所包含tile的位置,將渲染筆觸的參數(shù)從OperationQueue中彈出。2. 根據(jù)所計(jì)算出來計(jì)算出當(dāng)前像素的透明度。下面將介紹MyPaint是如何進(jìn)行顏色混合。 渲染過程如下:a) 計(jì)算mask區(qū)域每個(gè)像素的透明度topAlpha = *opacityb) 計(jì)算bottomAlpha的值,為做blend操作做準(zhǔn)備。并介紹了MyPaint是如何利用OpenMP多線程編程技術(shù)來提高繪制筆觸的性能。而且MyPaint使用了其他第三方的開源json庫(kù)去解析筆刷文件中的參數(shù),同時(shí)由于在Android中編寫底層組件和使用第三方庫(kù)的難度較大,且不易于調(diào)試,在上章也提到了MyPaint中圖像的數(shù)據(jù)格式與Android的格式不兼容,而在Android的上層API中含有相關(guān)API容易模擬渲染出MyPaint筆觸效果,簡(jiǎn)單易操作。本文將創(chuàng)建Surface的類來代替MyPaint中的MyPaintFixedTiledSurface,Surface繼承自Android中View控件,使用Bitmap類來維護(hù)畫布數(shù)據(jù),由于不使用OpenMP多線程技術(shù),取消掉基于tile繪制筆觸的機(jī)制。每一個(gè)View都有一個(gè)用于繪圖的畫布,這個(gè)畫布可以進(jìn)行任意擴(kuò)展。b) MotionEvent. ACTION_MOVE表示當(dāng)前手指在View區(qū)域進(jìn)行移動(dòng)。()方法去請(qǐng)求重新繪制該View,但系統(tǒng)不一定會(huì)去調(diào)用。 Surface類的設(shè)計(jì):圖 Surface結(jié)構(gòu)圖在Surface中各個(gè)成員變量和方法的意義如下:1. bitmap為Bitmap類型的成員變量,用于保存我們繪制的圖像數(shù)據(jù)。5. onDraw()和onTouchEvent()的使用已在上節(jié)中介紹過。 draw_dab()和get_color()方法的實(shí)現(xiàn)由于沒有直接使用MyPaint的原生的庫(kù),我們需要使用Android應(yīng)用層的API去模擬出類似MyPaint筆觸的效果。Shader類的使用,都需要先構(gòu)建Shader對(duì)象,然后通過Paint的setShader方法設(shè)置渲染對(duì)象,然后設(shè)置渲染對(duì)象,然后再繪制時(shí)使用這個(gè)Paint對(duì)象即可[11]。d越大透明度漸變?cè)酱?,?dāng)小于hardness時(shí)成2次方漸變,當(dāng)大于hardness時(shí),幾乎成線性漸變。2. 根據(jù)筆觸大小創(chuàng)建出RectF對(duì)象,該對(duì)象用于描述創(chuàng)建圓的邊框大小。 (localRadialGradient)。 = 0。Matrix m = new Matrix()。()。4. 將渲染好的Bitmap繪制到我們的主畫布中。在Android (int x, int y)的方法可以獲取指定位置上Bitmap的顏色。本節(jié)將創(chuàng)建名為MyBrush的類,根據(jù)MyPaintBrush的結(jié)構(gòu)去改寫成我們所需要的結(jié)構(gòu)。使得該對(duì)象在程序中只有一個(gè)實(shí)例存在。代碼如下:public static MyPaintBrush getBrush(){ if (mbrush == null) mbrush = new MyPaintBrush()。res和assets目錄不同點(diǎn)是,res會(huì)為每個(gè)該目錄下的資源分配一個(gè)資源ID,引用時(shí)可以直接應(yīng)用相應(yīng)的資源ID即可。Assets文件夾里面的文件都是一些原始格式的文件,需要通過AssetManager以字節(jié)流的形式將文件內(nèi)容讀入到內(nèi)存中。4. ()關(guān)閉AssetManager,釋放資源。在“opaque”中還包含兩個(gè)鍵值對(duì),一個(gè)是以“base_value”為鍵的對(duì)應(yīng)一個(gè)浮點(diǎn)型數(shù)值,另一個(gè)以“input”為鍵包含一個(gè)數(shù)組對(duì)象。部分筆刷效果對(duì)比如下:圖 鉛筆效果對(duì)比圖 帶透明度筆刷效果圖 涂抹效果筆刷對(duì)比由以上3組對(duì)比圖可以看出,筆刷效果的還原度還是比較高的。雖然Android平臺(tái)上主要開發(fā)API為JAVA語言進(jìn)行開發(fā),但是Android在繪制圖像和對(duì)Bitmap中的數(shù)據(jù)進(jìn)行處理時(shí),是調(diào)用的C/C++的Skia圖形庫(kù),所以對(duì)于這一部分的性能損失是很微小的。本章將實(shí)現(xiàn)繪圖軟件的筆刷選擇控件,取色盤控件,和筆刷的大小透明度調(diào)整控件等。 筆刷選擇模塊Android中生成用戶界面主要有兩種方式:直接用代碼生成和編寫XML布局文件。Android主要提供了線性布局、相對(duì)布局、絕對(duì)布局、表格布局、幀布局五大布局方式[15]。線性布局還可以對(duì)單獨(dú)的子元素指定weight,它用于描述該子元素在剩余空間中占有的大小比例。子元素就通過這些屬性和各自的ID配合指定位置關(guān)系。在此布局中的子元素的android:layout_x和android:layout_y屬性將生效,用于描述該子元素的坐標(biāo)位置。(4) 表格布局表格布局(TableLayout)適用于N行N列的布局格式。這樣的設(shè)計(jì)使得每個(gè)TableRow里的子元素都相當(dāng)于表格中的單元格一樣。 筆刷選擇控件的實(shí)現(xiàn)過程如下:1. 創(chuàng)建單個(gè)筆刷背景選擇器。主要代碼如下:?xml version= encoding=utf8 ? selector xmlns:android= item !普通狀態(tài) android:state_pressed=false android:drawable=drawable/ brush1_background_normal / item !按下狀態(tài) android:state_pressed=true android:drawable=drawable/ brush1_background _pressed / /selector2. XML創(chuàng)建線性布局,并設(shè)置相應(yīng)屬性。在第3章中我們使用RadialGradient來創(chuàng)建一個(gè)環(huán)形漸變的圖形來渲染一個(gè)筆觸,本節(jié)的顏色選取模塊將使用類似的SweepGradient來創(chuàng)建一個(gè)漸變的扇形漸變圓環(huán)。 顏色數(shù)組設(shè)置如下: private final int[] mColors = new int[] {0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000}。當(dāng)用戶觸摸到外部圓環(huán)時(shí),根據(jù)所觸摸到所在圓環(huán)位置的角度算出該觸摸位置的顏色,將該顏色設(shè)置給中心實(shí)心圓。拖動(dòng)條允許用戶拖動(dòng)滑塊來改變值。對(duì)于筆刷大小,限制在0到5之間,而透明度的現(xiàn)在在0到1之間。本文使用相對(duì)布局來。4. 創(chuàng)建兩個(gè)設(shè)計(jì)好的Slider對(duì)象,分別用于更新筆刷大小和透明度,使用線性布局來布局我們的Slider對(duì)象。實(shí)現(xiàn)過程如下:1. 繼承Android系統(tǒng)的SeekBar類,實(shí)現(xiàn)名為Slider的類。:圖 顏色選取模塊圖 當(dāng)用戶觸摸到外部取色圓環(huán)時(shí),會(huì)實(shí)時(shí)的將觸摸到顏色更新到中心實(shí)心圓中,如果觸摸到中心圓區(qū)域,則該顏色被設(shè)置給筆刷,讓筆刷去更新顏色。3. 重載View的onDraw方法,用onDraw傳入的Canvas對(duì)象繪制出供用戶選擇顏色的顏色環(huán)和讓用戶確認(rèn)該顏色的實(shí)心圓。2. 設(shè)置顏色數(shù)組,使顏色按照規(guī)定區(qū)間進(jìn)行漸變。將每個(gè)筆刷添加進(jìn)布局文件,每個(gè)筆刷使用ImageView帶表示,android:src屬性設(shè)置該筆刷的圖標(biāo)資源,將該ImageView的background設(shè)置為我們之前創(chuàng)建背景選擇器。為了實(shí)現(xiàn)這種效果我們使用Selector,一種背景選擇器,可以更改界面狀態(tài)。(5) 幀布局 幀布局(FrameLayout)是五大布局中最簡(jiǎn)單的一個(gè)布局,子元素放在布局文件的左上方,后面的子元素覆蓋在前面的子元素的上面,將前面的子元素部分遮擋住,但我們可以通過重力屬性來更改位置。TableRow是LinearLayout的子類,它的android:orientation屬性值恒為horizontal,并且它的android:layout_width和android:layout_height屬性值恒為MATCH_PARENT和WRAP_CONTENT。在此布局中的子元素可以相互重疊。RelativeLayout是Android五大布局結(jié)構(gòu)中最靈活的一種布局結(jié)構(gòu),比較適合一些復(fù)雜界面的布局。在此布局中的子元素里與位置相關(guān)的屬性將生效。如果是垂直排列,那么將是一個(gè)N行單列的結(jié)構(gòu),每一行只會(huì)有一個(gè)元素,而不論這個(gè)元素的寬度為多少;如果是水平排列,那么將是一個(gè)單行N列的結(jié)構(gòu)。因此推薦在XML中定義UI界面。該Activty將包含我們改寫好的繪圖引擎、筆刷選擇的界面、顏色選擇界面、改變筆刷大小和透明度的控件。有了繪圖引擎,下一章將對(duì)繪圖程序的界面部分開發(fā)進(jìn)行介紹。 本章小結(jié)本章主要實(shí)現(xiàn)了利用Android的API對(duì)MyPaint筆刷引擎進(jìn)行移植。 在解析Json文件時(shí),我們需要?jiǎng)?chuàng)建JSONObject對(duì)象,將assets文件夾下的筆刷格式以String類型讀入,調(diào)用JSONObject中g(shù)etDouble(String keyname)、getJSONObject(String keyname)、getJSONArray(String keyname)等方法將筆刷內(nèi)的數(shù)據(jù)保存到相應(yīng)數(shù)組中去。JSON是一種數(shù)據(jù)交換格式并采用鍵值對(duì)的存儲(chǔ)方式,它易于人們編寫和閱讀,同時(shí)機(jī)器生成和解析也很方便,這些特性使JSON成為理想的數(shù)據(jù)交換語言[14]。2. 調(diào)用Assetmanager的open(String fileName, int accessMode)方法則指定讀取的文件以及訪問模式就能得到輸入流InputStream。需要注意的是來自res和assets中文件只可以讀取而不可以進(jìn)行寫操作。 } Android assets 目錄介紹和應(yīng)用Android系統(tǒng)為每個(gè)程序提供了assets目錄,這個(gè)目錄內(nèi)的文件可以保持在打包的程序里[13]。將該類的構(gòu)造函數(shù)設(shè)置為私有,不讓外部實(shí)例化該對(duì)象,創(chuàng)建靜態(tài)方法獲取改對(duì)象的引用。下面將主要介紹與MyPaintBrush不同的地方。 繪制基本筆觸圖像的方法完成后下節(jié)講主要介紹MyPaintBrush對(duì)象的設(shè)計(jì),用MyPa
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1