Tạo button riêngBạn đã bao giờ thấy nhàm chán các control mặc định sẵn của Android chưa ??. Hay bạn cần 1 chút gì đó đặc biệt cho ứng dụng của bạn ??. Nếu có thì bạn có thể tham thảo bài
Trang 1Tạo button riêng
Bạn đã bao giờ thấy nhàm chán các control mặc định sẵn của Android chưa ?? Hay bạn cần 1 chút gì đó đặc biệt cho ứng dụng của bạn ?? Nếu có thì bạn có thể tham thảo bài viết này để tạo 1 button riêng đầy sống động
Đầu tiên các bạn tạo 1 Project như sau:
Project name: ChinhButton
Build Target: Android 2.3.3
Application name: ChinhButton
Package name: com.dac.ChinhButton
Create Activity: ChinhButton
Bước tiếp theo, các bạn cần 1 class có extends Button để làm button riêng của bạn Tạo class MyButton.java trong package chính và viết code như sau:
package com.dac.ChinhButton;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.Button;
public class MyButton extends Button {
private Paint mTextPaint, mPaint;
private String mText;
private int mAscent;
private Shader mShader;
private Matrix mMatrix = new Matrix();
private float mStart;
private float mSweep;
private float mRotate;
private static final float SWEEP_INC = 2;
private static final float START_INC = 15;
public MyButton(Context context) {
super(context);
initLabelView();
}
Trang 2public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
initLabelView();
}
private final void initLabelView() {
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(16);
mTextPaint.setColor(0xFF000000);
setPadding(15, 15, 15, 15);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(4);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mShader = new SweepGradient(this.getMeasuredWidth()/2,
this.getMeasuredHeight()/2, new int[] { Color.GREEN,
Color.RED, Color.CYAN,Color.DKGRAY },
null);
mPaint.setShader(mShader);
}
public void setText(String text) {
mText = text;
requestLayout();
invalidate();
}
public void setTextSize(int size) {
mTextPaint.setTextSize(size);
requestLayout();
invalidate();
}
public void setTextColor(int color) {
mTextPaint.setColor(color);
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int
heightMeasureSpec){
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
Trang 3result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
+ getPaddingRight();
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
} }
return result;
}
private int measureHeight(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
mAscent = (int) mTextPaint.ascent();
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else { result = (int) (-mAscent + mTextPaint.descent()) + getPaddingTop() + getPaddingBottom();
if (specMode == MeasureSpec.AT_MOST) {
Log.v("Messure Height", "At most Height:"+specSize); result = Math.min(result, specSize);
} }
return result;
}
private void drawArcs(Canvas canvas, RectF oval, boolean
useCenter,
Paint paint) { canvas.drawArc(oval, mStart, mSweep, useCenter, paint);
}
@Override protected void onDraw(Canvas canvas) {
mMatrix.setRotate(mRotate,
this.getMeasuredWidth()/2,
this.getMeasuredHeight()/2);
mShader.setLocalMatrix(mMatrix);
mRotate += 3;
if (mRotate >= 360) {
mRotate = 0;
} RectF drawRect = new RectF();
drawRect.set(this.getWidth()-mTextPaint.measureText(mText),
(this.getHeight()-mTextPaint.getTextSize())/2,
mTextPaint.measureText(mText),
this.getHeight()-(this.getHeight()-mTextPaint.getTextSize())/2);
drawArcs(canvas, drawRect, false, mPaint);
mSweep += SWEEP_INC;
if (mSweep > 360) {
Trang 4mSweep -= 360;
mStart += START_INC;
if (mStart >= 360) {
mStart -= 360;
} }
if(mSweep >180){
canvas.drawText(mText, getPaddingLeft(), getPaddingTop() -mAscent, mTextPaint); }
invalidate();
} }
Và phần xử dụng Button các bạn vào file main.xml khai báo như sau:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:weightSum="1">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button cua tui ne"
/>
<com.dac.ChinhButton.MyButton
android:layout_height="wrap_content"
android:id="@+id/mybutton1"
android:layout_width="wrap_content"/>
</LinearLayout>
Và trong file ChinhButton.java các bạn viết code như sau:
package com.dac.ChinhButton;
import android.app.Activity;
import android.os.Bundle;
public class ChinhButton extends Activity {
/** Called when the activity is first created */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyButton myb = (MyButton)findViewById(R.id.mybutton1);
myb.setText("Nobilomo_1990@yahoo.com");
myb.setTextSize(30);
Trang 5}
}
Cuối cùng button của bạn có hình dáng như sau:
Mọi ý kiến đóng góp các bạn vui lòng gữi bài viết về trang forum trang web www.laptrinhdidong.vn Rất mong nhận được sự phản hồi của các bạn.