1. 程式人生 > >android基礎--自定義View

android基礎--自定義View

 1.自定義view繪製字串

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) {

       //設定字串顏色

        mPaint.setColor(Color.WHITE);

         canvas.drawText("當前螢幕寬" + mScreenWidth, 0, 30, mPaint);

        canvas.drawText("當前螢幕高"+ mScreenHeight, 0, 60, mPaint);

         //設定字型大小

         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.繪製無規則幾何圖形

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);

            //設定畫布顏色 也就是背景顏色

            canvas.drawColor(Color.WHITE);

            mPaint.setColor(Color.BLACK);

            canvas.drawText("繪製無規則幾何圖形喔!!!", 150, 30, mPaint);

            //繪製一條線

            mPaint.setColor(Color.BLACK);

            mPaint.setStrokeWidth(4);

            canvas.drawLine(0, 0, 100, 100, mPaint);

            //繪製一個矩形

            mPaint.setColor(Color.YELLOW);

            canvas.drawRect(0, 120, 100, 200, mPaint);

            //繪製一個圓形

            mPaint.setColor(Color.BLUE);

            canvas.drawCircle(80, 300, 50, mPaint);

            //繪製一個橢圓

            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.圖片的繪製以及旋轉縮放的實現

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);

// 向左移動

Button botton0 = (Button) findViewById(R.id.buttonLeft);

botton0.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

imageView.setPosLeft();

}

});

// 向右移動

Button botton1 = (Button) findViewById(R.id.buttonRight);

botton1.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

imageView.setPosRight();

}

});

// 左旋轉

Button botton2 = (Button) findViewById(R.id.buttonRotationLeft);

botton2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

imageView.setRotationLeft();

}

});

// 右旋轉

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);

bitMapDisplay = bitMap;

mMatrix = new Matrix();

// 獲取圖片寬高

m_bitMapWidth = bitMap.getWidth();

m_bitMapHeight = bitMap.getHeight();

}

// 向左移動

public void setPosLeft() {

m_posX -= 10;

}

// 向右移動

public void setPosRight() {

m_posX += 10;

}

// 向左旋轉

public void setRotationLeft() {

mAngle--;

setAngle();

}

// 向右旋轉

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();

}

}

// 設定縮放比例

public void setAngle() {

mMatrix.reset();

mMatrix.setRotate(mAngle);

bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth,

m_bitMapHeight, mMatrix, true);

}

// 設定旋轉比例

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="圖片向左移動"

            />

        <Button android:id="@+id/buttonRight"

            android:layout_width="fill_parent" android:layout_height="wrap_content"

            android:text="圖片向右移動"

            />

        <Button android:id="@+id/buttonRotationLeft"

            android:layout_width="fill_parent" android:layout_height="wrap_content"

            android:text="圖片左旋轉"

            />

        <Button android:id="@+id/buttonRotationRight"

            android:layout_width="fill_parent" android:layout_height="wrap_content"

            android:text="圖片右旋轉"

            />

        <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動畫

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("播放動畫中...", 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();

}

}

}