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

正文內(nèi)容

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

2024-11-12 04:47本頁面
  

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