生活随笔
收集整理的這篇文章主要介紹了
Android软件开发之盘点自定义View界面大合集(二)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android軟件開(kāi)發(fā)之盤(pán)點(diǎn)自定義View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技術(shù)博客
雨松MOMO帶大家盤(pán)點(diǎn)Android 中的自定義View界面的繪制今天我用自己寫(xiě)的一個(gè)Demo 和大家詳細(xì)介紹一個(gè)Android中自定義View中的使用與繪制技巧。
?
1.自定義view繪制字符串
相信在實(shí)際開(kāi)發(fā)過(guò)程中必然很多地方都須要用到系統(tǒng)字 為什么會(huì)用到系統(tǒng)字? 方便 省內(nèi)存 我相信做過(guò)J2ME游戲開(kāi)發(fā)的朋友應(yīng)該深知內(nèi)存有多么多么重要 而且使用它還可以帶來(lái)一個(gè)更重要的好處就是很方便的可以實(shí)現(xiàn)多國(guó)語(yǔ)言的切換 筆者現(xiàn)在在正在做的一個(gè)產(chǎn)品就是可以多語(yǔ)言切換的軟件 有英語(yǔ) 繁體中文 等等 設(shè)想如果使用圖片字的話那每個(gè)語(yǔ)言都須要出一套圖,我用一個(gè)例子簡(jiǎn)單介紹一下繪制字符串。?
?
package?cn.m15.xys; ??import?android.app.Activity; ?import?android.content.Context; ?import?android.graphics.Canvas; ?import?android.graphics.Color; ?import?android.graphics.Paint; ?import?android.graphics.Paint.FontMetrics; ?import?android.os.Bundle; ?import?android.view.Display; ?import?android.view.View; ??public?class?Font?extends?Activity?{ ?????public?int?mScreenWidth?=?0; ?????public?int?mScreenHeight?=?0; ?????@Override ?????protected?void?onCreate(Bundle?savedInstanceState)?{ ?????setContentView(new?FontView(this)); ?????//?獲取屏幕寬高 ?????Display?display?=?getWindowManager().getDefaultDisplay(); ?????mScreenWidth??=?display.getWidth(); ?????mScreenHeight?=?display.getHeight(); ?????super.onCreate(savedInstanceState); ??????} ??????class?FontView?extends?View?{ ?????????public?final?static?String?STR_WIDTH?=?"獲取字符串寬為:";? ?????????public?final?static?String?STR_HEIGHT?=?"獲取字體高度為:";? ?????????Paint?mPaint?=?null; ????????? ?????public?FontView(Context?context)?{ ?????????super(context); ?????????mPaint?=?new?Paint(); ?????} ??????@Override ?????protected?void?onDraw(Canvas?canvas)?{ ?????????//設(shè)置字符串顏色 ?????????mPaint.setColor(Color.WHITE); ?????????canvas.drawText("當(dāng)前屏幕寬"?+?mScreenWidth,?0,?30,?mPaint); ?????????canvas.drawText("當(dāng)前屏幕高"+?mScreenHeight,?0,?60,?mPaint); ?????????//設(shè)置字體大小 ?????????mPaint.setColor(Color.RED); ?????????mPaint.setTextSize(18); ?????????canvas.drawText("字體大小為18",?0,?90,?mPaint); ?????????//消除字體鋸齒 ?????????mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); ?????????canvas.drawText("消除字體鋸齒后",?0,?120,?mPaint); ?????????//獲取字符串寬度 ?????????canvas.drawText(STR_WIDTH?+?getStringWidth(STR_WIDTH),?0,?150,?mPaint); ?????????//獲取字體高度 ?????????canvas.drawText(STR_HEIGHT?+?getFontHeight(),?0,?180,?mPaint); ?????????//從string.xml讀取字符串繪制 ?????????mPaint.setColor(Color.YELLOW); ?????????canvas.drawText(getResources().getString(R.string.string_font),?0,?210,?mPaint); ?????????super.onDraw(canvas); ?????} ????? ?????/** ??????*?獲取字符串寬 ??????*?@param?str ??????*?@return ??????*/ ?????private?int?getStringWidth(String?str)?{ ?????????return?(int)?mPaint.measureText(STR_WIDTH);? ?????} ?????/* ??????*?獲取字體高度 ??????*/ ?????private?int?getFontHeight()?{ ?????????FontMetrics?fm?=?mPaint.getFontMetrics(); ?????????return?(int)Math.ceil(fm.descent?-?fm.top)?+?2; ?????} ?????} ?}?2.繪制無(wú)規(guī)則幾何圖形
繪制無(wú)規(guī)則幾何圖形似乎在實(shí)際工作中很少可以用到 原因是用程序去繪制圖形即使在精準(zhǔn)再好看也不會(huì)有美術(shù)出的圖片好看 但是使用程序繪制圖形作為學(xué)習(xí)來(lái)說(shuō)卻是基礎(chǔ)中的基礎(chǔ),所以建議大家都看一看。
package?cn.m15.xys; ??import?android.app.Activity; ?import?android.content.Context; ?import?android.graphics.Canvas; ?import?android.graphics.Color; ?import?android.graphics.Paint; ?import?android.graphics.Path; ?import?android.graphics.RectF; ?import?android.os.Bundle; ?import?android.view.View; ??public?class?Geometry?extends?Activity?{ ?????public?int?mScreenWidth?=?0; ?????public?int?mScreenHeight?=?0; ??????@Override ?????protected?void?onCreate(Bundle?savedInstanceState)?{ ?????setContentView(new?GeometryView(this)); ?????super.onCreate(savedInstanceState); ??????} ??????class?GeometryView?extends?View?{ ?????Paint?mPaint?=?null; ??????public?GeometryView(Context?context)?{ ?????????super(context); ?????????mPaint?=?new?Paint(); ?????????mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); ?????} ??????@Override ?????protected?void?onDraw(Canvas?canvas)?{ ?????????super.onDraw(canvas); ????? ?????????//設(shè)置畫(huà)布顏色?也就是背景顏色 ?????????canvas.drawColor(Color.WHITE); ???????? ?????????mPaint.setColor(Color.BLACK); ?????????canvas.drawText("繪制無(wú)規(guī)則幾何圖形喔!!!",?150,?30,?mPaint); ????????? ?????????//繪制一條線 ?????????mPaint.setColor(Color.BLACK); ?????????mPaint.setStrokeWidth(4); ?????????canvas.drawLine(0,?0,?100,?100,?mPaint); ????????? ?????????//繪制一個(gè)矩形 ?????????mPaint.setColor(Color.YELLOW); ?????????canvas.drawRect(0,?120,?100,?200,?mPaint); ????????? ?????????//繪制一個(gè)圓形 ?????????mPaint.setColor(Color.BLUE); ?????????canvas.drawCircle(80,?300,?50,?mPaint); ????????? ?????????//繪制一個(gè)橢圓 ?????????mPaint.setColor(Color.CYAN); ?????????canvas.drawOval(new?RectF(300,370,120,100),?mPaint); ????????? ?????????//繪制多邊形 ?????????mPaint.setColor(Color.BLACK); ?????????Path?path?=?new?Path(); ?????????path.moveTo(150+5?,?400?-50); ?????????path.lineTo(150+45,?400?-?50); ?????????path.lineTo(150+30,?460?-?50); ?????????path.lineTo(150+20,?460?-?50); ?????????path.close(); ?????????canvas.drawPath(path,?mPaint); ????????? ?????} ?????} ?}?3.圖片的繪制以及旋轉(zhuǎn)縮放的實(shí)現(xiàn)
在這點(diǎn)上Android 確實(shí)比J2ME 強(qiáng)大很多 手機(jī)游戲開(kāi)發(fā)最痛苦的是什么?? 是游戲引擎的開(kāi)發(fā),但是工程師會(huì)把大部分時(shí)間浪費(fèi)在對(duì)坐標(biāo)上,如果寫(xiě)引擎的時(shí)候沒(méi)有把自適應(yīng)考慮周全后期會(huì)非常痛苦,現(xiàn)在手機(jī)屏幕分辨率是各式各樣 內(nèi)存大小也是各式各樣 所以可見(jiàn)自適應(yīng)屏幕算法有多么的重要。
package?cn.m15.xys; ??import?android.app.Activity; ?import?android.content.Context; ?import?android.graphics.Bitmap; ?import?android.graphics.BitmapFactory; ?import?android.graphics.Canvas; ?import?android.graphics.Matrix; ?import?android.graphics.Paint; ?import?android.os.Bundle; ?import?android.view.View; ?import?android.view.View.OnClickListener; ?import?android.widget.Button; ?import?android.widget.LinearLayout; ??public?class?Image?extends?Activity?{ ?????ImageView?imageView?=?null; ??????@Override ?????protected?void?onCreate(Bundle?savedInstanceState)?{ ?????imageView?=?new?ImageView(this); ?????setContentView(R.layout.image); ?????LinearLayout?ll?=?(LinearLayout)?findViewById(R.id.iamgeid); ?????ll.addView(imageView); ?????//?向左移動(dòng) ?????Button?botton0?=?(Button)?findViewById(R.id.buttonLeft); ?????botton0.setOnClickListener(new?OnClickListener()?{ ?????????@Override ?????????public?void?onClick(View?arg0)?{ ?????????imageView.setPosLeft(); ?????????} ?????}); ??????//?向右移動(dòng) ?????Button?botton1?=?(Button)?findViewById(R.id.buttonRight); ?????botton1.setOnClickListener(new?OnClickListener()?{ ?????????@Override ?????????public?void?onClick(View?arg0)?{ ?????????imageView.setPosRight(); ?????????} ?????}); ?????//?左旋轉(zhuǎn) ?????Button?botton2?=?(Button)?findViewById(R.id.buttonRotationLeft); ?????botton2.setOnClickListener(new?OnClickListener()?{ ?????????@Override ?????????public?void?onClick(View?arg0)?{ ?????????imageView.setRotationLeft(); ?????????} ?????}); ??????//?右旋轉(zhuǎn) ?????Button?botton3?=?(Button)?findViewById(R.id.buttonRotationRight); ?????botton3.setOnClickListener(new?OnClickListener()?{ ?????????@Override ?????????public?void?onClick(View?arg0)?{ ?????????imageView.setRotationRight(); ?????????} ?????}); ??????//?縮小 ?????Button?botton4?=?(Button)?findViewById(R.id.buttonNarrow); ?????botton4.setOnClickListener(new?OnClickListener()?{ ??????????@Override ?????????public?void?onClick(View?arg0)?{ ?????????imageView.setNarrow(); ?????????} ?????}); ??????//?放大 ?????Button?botton5?=?(Button)?findViewById(R.id.buttonEnlarge); ?????botton5.setOnClickListener(new?OnClickListener()?{ ??????????@Override ?????????public?void?onClick(View?arg0)?{ ?????????imageView.setEnlarge(); ?????????} ?????}); ??????super.onCreate(savedInstanceState); ??????} ??????class?ImageView?extends?View?{ ?????Paint?mPaint?=?null; ?????Bitmap?bitMap?=?null; ?????Bitmap?bitMapDisplay?=?null; ?????int?m_posX?=?120; ?????int?m_posY?=?50; ?????int?m_bitMapWidth?=?0; ?????int?m_bitMapHeight?=?0; ?????Matrix?mMatrix?=?null; ?????float?mAngle?=?0.0f; ?????float?mScale?=?1f;//1為原圖的大小 ??????public?ImageView(Context?context)?{ ?????????super(context); ?????????mPaint?=?new?Paint(); ?????????mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); ?????????bitMap?=?BitmapFactory.decodeResource(this.getResources(), ?????????????R.drawable.image); ?????????bitMapbitMapDisplay?=?bitMap; ?????????mMatrix?=?new?Matrix(); ?????????//?獲取圖片寬高 ?????????m_bitMapWidth?=?bitMap.getWidth(); ?????????m_bitMapHeight?=?bitMap.getHeight(); ?????} ??????//?向左移動(dòng) ?????public?void?setPosLeft()?{ ?????????m_posX?-=?10; ?????} ??????//?向右移動(dòng) ?????public?void?setPosRight()?{ ?????????m_posX?+=?10; ?????} ??????//?向左旋轉(zhuǎn) ?????public?void?setRotationLeft()?{ ?????????mAngle--; ?????????setAngle(); ?????} ??????//?向右旋轉(zhuǎn) ?????public?void?setRotationRight()?{ ?????????mAngle++; ?????????setAngle(); ?????} ??????//?縮小圖片 ?????public?void?setNarrow()?{ ?????????if?(mScale?>?0.5)?{ ?????????mScale?-=?0.1; ?????????setScale(); ?????????} ?????} ??????//?放大圖片 ?????public?void?setEnlarge()?{ ?????????if?(mScale?<?2)?{ ?????????mScale?+=?0.1; ?????????setScale(); ?????????} ?????} ??????//?設(shè)置縮放比例 ?????public?void?setAngle()?{ ?????????mMatrix.reset(); ?????????mMatrix.setRotate(mAngle); ?????????bitMapDisplay?=?Bitmap.createBitmap(bitMap,?0,?0,?m_bitMapWidth, ?????????????m_bitMapHeight,?mMatrix,?true); ?????} ??????//?設(shè)置旋轉(zhuǎn)比例 ?????public?void?setScale()?{ ?????????mMatrix.reset(); ?????????//float?sx?X軸縮放? ?????????//float?sy?Y軸縮放 ?????????mMatrix.postScale(mScale,?mScale); ?????????bitMapDisplay?=?Bitmap.createBitmap(bitMap,?0,?0,?m_bitMapWidth, ?????????????m_bitMapHeight,?mMatrix,?true); ?????} ??????@Override ?????protected?void?onDraw(Canvas?canvas)?{ ?????????super.onDraw(canvas); ?????????canvas.drawBitmap(bitMapDisplay,?m_posX,?m_posY,?mPaint); ?????????invalidate(); ?????} ?????} ?}?<?xml?version="1.0"?encoding="utf-8"?>?<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?????android:id="@+id/iamgeid"?????android:orientation="vertical"?????android:layout_width="fill_parent"?????android:layout_height="fill_parent"?????>?????????<Button?android:id="@+id/buttonLeft"?????????????android:layout_width="fill_parent"?android:layout_height="wrap_content"?????????????android:text="圖片向左移動(dòng)"?????????????/>?????????<Button?android:id="@+id/buttonRight"?????????????android:layout_width="fill_parent"?android:layout_height="wrap_content"?????????????android:text="圖片向右移動(dòng)"?????????????/>?????????<Button?android:id="@+id/buttonRotationLeft"?????????????android:layout_width="fill_parent"?android:layout_height="wrap_content"?????????????android:text="圖片左旋轉(zhuǎn)"?????????????/>?????????<Button?android:id="@+id/buttonRotationRight"?????????????android:layout_width="fill_parent"?android:layout_height="wrap_content"?????????????android:text="圖片右旋轉(zhuǎn)"?????????????/>?????????<Button?android:id="@+id/buttonNarrow"?????????????android:layout_width="fill_parent"?android:layout_height="wrap_content"?????????????android:text="圖片縮小"?????????????/>?????????<Button?android:id="@+id/buttonEnlarge"?????????????android:layout_width="fill_parent"?android:layout_height="wrap_content"?????????????android:text="圖片放大"?????????????/>?</LinearLayout>?4.播放frame動(dòng)畫(huà)做游戲的話播放動(dòng)畫(huà)可就是必不可少的元素 幀動(dòng)畫(huà)幀動(dòng)畫(huà) 顧名思義是一幀一幀的播放 。 實(shí)際在開(kāi)發(fā)中為了節(jié)省內(nèi)存美術(shù)會(huì)把人物的圖片切成一小塊一小塊然后由程序根據(jù)編輯器生成的點(diǎn)把圖片在拼接起來(lái)這樣就可以做到用更少的圖片去實(shí)現(xiàn)更多的動(dòng)畫(huà)效果因?yàn)椴惶奖憬榻B圖片編輯器 這個(gè)demo我只給大家簡(jiǎn)單的介紹一下播放動(dòng)畫(huà)的原理 后期我會(huì)深入講解。如圖所示這個(gè)小人一直在行走 實(shí)際上是4張圖片在來(lái)回切換 每張圖片延遲500毫秒 后播下一張 以此類推。
package?cn.m15.xys; ??import?android.app.Activity; ?import?android.content.Context; ?import?android.graphics.Bitmap; ?import?android.graphics.BitmapFactory; ?import?android.graphics.Canvas; ?import?android.graphics.Color; ?import?android.graphics.Paint; ?import?android.os.Bundle; ?import?android.view.View; ??public?class?FramAnimation?extends?Activity?{ ?????public?final?static?int?ANIM_COUNT?=?4; ??????@Override ?????protected?void?onCreate(Bundle?savedInstanceState)?{ ?????setContentView(new?FramView(this)); ?????super.onCreate(savedInstanceState); ??????} ??????class?FramView?extends?View?{ ?????Bitmap[]?bitmap?=?new?Bitmap[ANIM_COUNT]; ?????Bitmap?display?=?null; ?????Paint?paint?=?null; ?????long?startTime?=?0; ?????int?playID?=?0; ??????public?FramView(Context?context)?{ ?????????super(context); ?????????for?(int?i?=?0;?i?<?ANIM_COUNT;?i++)?{ ?????????bitmap[i]?=?BitmapFactory.decodeResource(this.getResources(), ?????????????R.drawable.hero_a?+?i); ?????????} ?????????display?=?bitmap[0]; ?????????paint?=?new?Paint(); ?????????startTime?=?System.currentTimeMillis(); ?????} ??????@Override ?????protected?void?onDraw(Canvas?canvas)?{ ?????????super.onDraw(canvas); ?????????paint.setColor(Color.WHITE); ?????????canvas.drawText("播放動(dòng)畫(huà)中...",?100,?30,?paint); ?????????long?nowTime?=?System.currentTimeMillis(); ?????????if?(nowTime?-?startTime?>=?500)?{ ?????????startTime=nowTime; ?????????playID++; ?????????if?(playID?>=?ANIM_COUNT)?{ ?????????????playID?=?0; ?????????} ?????????canvas.drawBitmap(bitmap[playID],?100,?100,?paint); ?????????} ?????????invalidate(); ?????} ?????} ??}? 最后如果你還是覺(jué)得我寫(xiě)的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來(lái) 歡迎大家一起討論學(xué)習(xí)
雨松MOMO希望可以和大家一起進(jìn)步。
下載地址:http://download.csdn.net/source/3448152
轉(zhuǎn)載于:https://www.cnblogs.com/seven1979/p/4236636.html
總結(jié)
以上是生活随笔為你收集整理的Android软件开发之盘点自定义View界面大合集(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。