android不规则按钮的实现方式

个人使用过的不规则按钮的实现方式有以下几种:
1. 使用矢量图自绘,layer-list,shape都是不可缺少的元素。
2. 使用imagebutton,src设为图片,background设为transparent
3. 使用imagebutton,src不设置,background设置为图片
4. 使用button,使用9patch背景图片,可使用($ANDROID_SDK/tools/draw9patch.bat)获取9patch图片。


使用src作为图片源的时候,总是控制不好图片大小,scaleType控制起来不是很方便。
使用background的时候,不同于css的background,该图片是根据控件大小自动缩放的。
甚至变形都可以。
如果是固定的大小,个人比较倾向于使用imagebutton,并且设置background作为背景图片,当然,可以结合selector或者使用矢量图的layer-list.






=============================================


android ImageButton默认响应区域是矩形,而有时候界面的需要会使用不规则图片,比如扇形,要响应有图片的地方,没图片的地方不响应,今天想了下,实现了,关键代码如下:
imgbt=(ImageButton)findViewById(R.id.imgbt01);
bitmap=((BitmapDrawable)(imgbt.getDrawable())).getBitmap();//得到ImageButton的图片
imgbt.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(bitmap.getPixel((int)(event.getX()),((int)event.getY()))==0){//判断点击处像素的颜色是否为0,0表示没                                                                                                                                     //内容
System.out.println("点击区没图像    "+
bitmap.getPixel((int)(event.getX()),((int)event.getY())));
}else{
System.out.println("点击区有图像    "+
bitmap.getPixel((int)(event.getX()),((int)event.getY())));
}
return false;
}
});




================================================

最近跟同事在討論明星臉改版的問題,新版本可能會使用不規則形狀按鈕,繼續跟上一個視覺合作,新版本照照明星臉搭配上這種按鈕顯得更活潑,這篇記錄ImageButton不規則形狀按鈕的使用方法。




上網查了一下該怎麼處理,發現其實並不難,而且只要下關鍵字「不規則形狀 ImageButton」就可以找到非常多的資料,小蛙在這邊記錄一下剛剛測試的,之後如果有什麼其他修改會繼續補充在這邊。


一開始聽到ImageButton要做成不規則形狀好像很困難,網路上找到的做法大多如下:首先我們先建立一個ImageButton,在layou.xml中透過android:background="#00000000”把背景設定成透明,之後在程式中取得ImageButton的Bitmap元件,在Bitmap上設定OnTouchListener監控觸控事件,當觸控事件發生後再判斷所擊點的座標上有沒有pixel存在,並做相對應的處理。程式碼如下:


?12345678910111213141516 ImageButton img = (ImageButton)findViewById(R.id.imageButton1); // 取得ImageButton中使用的Bitmap final Bitmap bitmap = ((BitmapDrawable)(img.getDrawable())).getBitmap(); // 設定觸控螢幕監聽 img.setOnTouchListener(new View.OnTouchListener() {     @Override    public boolean onTouch(View v, MotionEvent event) {         // 如果點到的地方getPixel() = 0,表示該點不在圖形內         f(bitmap.getPixel((int)(event.getX()),((int)event.getY()))==0){             Log.e("沒有點到", "NO");         }else{             Log.e("點到圖片", "Yes");         }         return false;     } }); 
這邊可以再設定一個flag去控制touch(click)只執行一次(避免同個動作會重複多次,從LogCat中就可以看到)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值