各位Android安卓開發者大家好! ^^
今天小黑人要與大家分享的是"圖片倒影",沒錯就是倒影也可以算是繪製一個上下顛倒且有透明度的圖片,而顯示圖片的元件為ImageView,所以小黑人要與大家說明的就是如何創造一個類別且繼承ImageView後,進行覆寫ImageView的顯示動作並加上倒影的部分,倒影其實在偏向特效部分的開發是一個很常用的功能,這個看似複雜其實並不難的功能該如何撰寫呢,就讓我們繼續看下去吧!
1. 首先我們要建立一個class,就暫命名為MyImageView,而這個class是繼承ImageView元件,下方為MyImageView詳細內容與繪製圖片倒影的程式碼 :
package com.android.pubby;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class MyImageView extends ImageView
{
public MyImageView(Context
context, AttributeSet attrs)
{
super(context, attrs);
//讀取Layout元件時進入,取得Layout內設定的圖片Bitmap
Bitmap ImgBitmap =
((BitmapDrawable)this.getDrawable()).getBitmap();
//重新繪製並加入倒影
Reflection(ImgBitmap);
}
private void Reflection(Bitmap
ImgBitmap)
{
//原始圖與倒影間距
final int mGap = 0;
int mWidth =
ImgBitmap.getWidth();
int mHeight =
ImgBitmap.getHeight();
//建立倒影的Bitmap
Matrix mMatrix = new
Matrix();
mMatrix.preScale(1, -1);
Bitmap mReflectionImage =
Bitmap.createBitmap(ImgBitmap, 0, 0, mWidth, mHeight, mMatrix, false);
//原始圖與倒影一起的Bitmap
Bitmap mBitmap =
Bitmap.createBitmap(mWidth, (mHeight + mHeight), Config.ARGB_8888);
//繪製原始圖
Canvas mCanvas = new
Canvas(mBitmap);
mCanvas.drawBitmap(ImgBitmap, 0,
0, null);
//繪製倒影圖
Paint mPaint = new Paint();
mCanvas.drawRect(0, mHeight,
mWidth, mHeight + mGap, mPaint);
mCanvas.drawBitmap(mReflectionImage, 0, mHeight + mGap, null);
//加入透明度
Paint mLinearPaint = new
Paint();
LinearGradient mLinearGradient =
new LinearGradient(0,ImgBitmap.getHeight(), 0, mBitmap.getHeight()+ mGap,
0x80ffffff, 0x00ffffff, TileMode.CLAMP);
mLinearPaint.setShader(mLinearGradient);
mLinearPaint.setXfermode(new
PorterDuffXfermode(Mode.DST_IN));
mCanvas.drawRect(0, mHeight,
mWidth, mBitmap.getHeight() + mGap, mLinearPaint);
this.setImageBitmap(mBitmap);
}
}
2. 完成MyImageView倒影的class後,剩下的只要在Layout內把MyImageView呼叫出來就完成囉 :
<com.android.pubby.MyImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/pubby"
/>
下方為畫面預覽 :
左圖為正常ImageView元件顯示圖片畫面。
右圖為覆寫ImageView元件且增加倒影的圖片畫面。
以上就是重新創建class並繼承ImageView且覆寫增加圖片倒影的程式碼,大家可以實作試試看,還有圖片盡量不要放太大張,因為在重新繪製原圖與倒影時皆會產生新的Bitmap圖片空間,所以針對記憶體還是有一定的消耗!
謝謝大家,如有任何問題都可以和小黑人一起交流討論!
☆小黑人☆
我是一個對app很有興趣的人,希望能和你一同討論程式碼,現在就讀屏東大學,曾經寫過一個藍芽對arduino面板的app程式,我想要一個可以一同討論的朋友或者老師
回覆刪除如果可以的話可以加我FB,因為在這裡留言,沒辦法即時討論
等小黑人老師回我後,我再拿出我的FB名字
您好,很高興您的支持,
刪除小黑人很樂意與大家一起分享研究討論!
有任何問題也可以直接寄到小黑人的信箱(deanpubby@gmail.com),
感謝您的留言 ^^
其實我目前碰到了一個小問題,我雖然可以寫出藍芽對Arduino的控制App,但是我無法寫出手機對手機互相傳輸資料的App,仔細研究過別人寫的藍芽聊天室程式碼卻沒有收穫= =,可以請小黑人老師對此發一篇教學的文章嗎?
刪除一個App可以讓兩台手機互相傳送資料,實現用藍芽讓兩台手機互動,像是小遊戲之類的,可以用藍芽對戰
好的,小黑人會針對藍牙技術的開發來寫篇文章的,
刪除非常感謝您的建議,很高興與您共同討論藍牙技術,
感謝您的留言,謝謝!
小黑人老師,我想要在自己的APP加上網路搜尋功能,具體來說,假如我在editText1輸入"天天",然後按搜尋,會自動開啟瀏覽器,自動搜尋關鍵字"天天",請問這辦得到嗎?
回覆刪除您好,很抱歉這麼久才回覆您,
刪除根據您的提問小黑人與您解釋,
答案是辦得到!
需要注意兩個步驟:
1. 如果要開啟瀏覽器的話就用Intent呼叫,若用WebView則可省略第一步驟.
2. 關鍵就在於帶入的網址:小黑人以Google搜尋為例,
若要查詢關鍵字為“Android”,則帶網址為”https://www.google.com.tw/?gws_rd=ssl#q=” + "Android",後面“Android”為您要搜尋的關鍵字.
若要查詢“Android Pubby",則網址為”https://www.google.com.tw/?gws_rd=ssl#q=Android+Pubby",這樣以此類推.
感謝您的提問!
成功了!!!
刪除謝謝囉