Android图片文字按钮

今天在整理资料的时候发现有个问题,原来做的些软件中用到的按钮,要么是纯文字的,要么是纯图片的

突然看有款软件上的按钮文字可以同时显示,

而且我用hierarchyviewer查看了下

他确确实实是图片加文字的,所以问了下群友并且思考了下,总有以下解决方法

1.直接用图片和文字的截图放在Imagebutton上显示,这种事最简单但是也是最占资源,以后修改和国家化都是最不方便的方法

 

2.用button上设置图片的方法可以,这种简单,并且以后很容易修改

<Button android:drawableTop="@drawable/****">
3.还有个方法也可以实现相同的效果
textview.setCompoundDrawables(null, icon, null, null);

4.还有一种比较基数的方法啊,就是自定一个类似button的空间实现图片和文字的共存

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.graphics.Rect;

import android.view.MotionEvent;

import android.view.View;

public class ImageTextButton extends View{

private final static int WIDTH_PADDING = 8;

private final static int HEIGHT_PADDING = 10;

private final static int SPACE = 10;

private final String label;

private final int imageResId;

private final Bitmap image;

private int fontWidth;

private int fontHeight;

public ImageTextButton(final Context c,int rid,String text){

super(c);

this.label = text;

this.imageResId = rid;

this.image = BitmapFactory.decodeResource(c.getResources(),imageResId);

setFocusable(true);

setClickable(true);

getFontWidthAndHeight();

}

private void getFontWidthAndHeight(){

Paint pFont = new Paint(); 

Rect rect = new Rect(); 

pFont.getTextBounds("", 0, 1, rect); 

this.fontHeight = rect.height();

this.fontWidth = rect.width();

}

private int getTextWidth(String text){

return text.length()*this.fontWidth;

}

@Override

protected void onFocusChanged(boolean gainFocus, int direction,

Rect previouslyFocusedRect) {

if (gainFocus == true){

this.setBackgroundColor(Color.rgb(255, 165, 0));

}

else{

this.setBackgroundColor(Color.alpha(0));

}

}

@Override

protected void onDraw(Canvas canvas) {

Paint textPaint = new Paint();

textPaint.setColor(Color.WHITE);

canvas.drawBitmap(image, WIDTH_PADDING / 2, HEIGHT_PADDING / 2, null);

canvas.drawText(label, (image.getWidth()-getTextWidth(label)/2)/ 2, (HEIGHT_PADDING / 2) +

image.getHeight() + 8+SPACE, textPaint);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();

switch(action){

case MotionEvent.ACTION_DOWN:

case MotionEvent.ACTION_MOVE:

this.setBackgroundColor(Color.rgb(255, 165, 0));

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

this.setBackgroundColor(Color.alpha(0));

break;

}

return super.onTouchEvent(event);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));

}

private int measureWidth(int measureSpec){

int preferred = image.getWidth() * 2;

return getMeasurement(measureSpec, preferred);

}

private int measureHeight(int measureSpec){

   int preferred = image.getHeight()+this.fontHeight+SPACE*2;

   return getMeasurement(measureSpec, preferred);

}

private int getMeasurement(int measureSpec, int preferred){

  int specSize = MeasureSpec.getSize(measureSpec);

int measurement = 0;

switch(MeasureSpec.getMode(measureSpec)){

case MeasureSpec.EXACTLY:

measurement = specSize;

break;

case MeasureSpec.AT_MOST:

measurement = Math.min(preferred, specSize);

break;

default:

measurement = preferred;

break;

}

return measurement;

}

public String getLabel(){

return label;

}  

public int getImageResId(){

return imageResId;

}

}

 

只是简单的总结,不是很详细,希望大家看完后多多补充
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值