1. 程式人生 > >自定義View學習-繪製一個簡單的圓

自定義View學習-繪製一個簡單的圓

想把平時學到的關於自定義View的一些東西記錄下來,從最基本的慢慢往難學吧。這篇是簡單的不能再簡單的繪製,算是一個入門吧。做了兩個,一個是就顯示圓。還有一個是繪製的圓根據手指滑動的位置來移動。並且圓的半徑是動態的,所以這也就導致了你的圓跟著你的手指滑動時,一會大,一會小的。個人覺得這個還是挺好玩的。好了接下來進入主題。
這裡寫圖片描述
這裡寫圖片描述

這個圓就是繼承了View,然後使用了自定義屬性。
先上自定義屬性:

<declare-styleable name="Circle">
    <attr name="android:color"/>
    <attr name="radius"
format="dimension"/>
<attr name="alpha" format="integer"/> </declare-styleable>

接下來是自定義的這個圓:

public class Circle extends View {

    private Paint mPaint = new Paint();
    private float mRadius;

    /**
     * 這個是從程式碼中建立自定義控制元件時間呼叫
     * @param context
     */
    public Circle
(Context context) { this(context,null); } /** * 這個是從xml中建立自定義控制元件時間呼叫 * @param context * @param attrs */ public Circle(Context context, AttributeSet attrs) { this(context,attrs,0); } /** * 這個是從xml中建立自定義控制元件時間呼叫,並且帶有Style * AttributeSet 可以得到這個控制元件的所有屬性 * @param
context * @param attrs * @param defStyleAttr */
public Circle(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs); } private void init(AttributeSet attrs){ TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.Circle); //int mColor = array.getColor(R.styleable.Circle_wbcolor, Color.BLACK); int mColor = array.getColor(R.styleable.Circle_android_color,Color.BLUE); mRadius = array.getDimension(R.styleable.Circle_radius, 50); //半徑 int mAlpha = array.getInteger(R.styleable.Circle_alpha,10); array.recycle(); mPaint.setDither(true); //防抖 mPaint.setAntiAlias(true); //抗鋸齒 mPaint.setStrokeWidth(50); //設定畫筆的線寬 mPaint.setColor(mColor); mPaint.setAlpha(mAlpha); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); DisplayMetrics dm = getResources().getDisplayMetrics(); //得到螢幕 int width = dm.widthPixels/2; int height = dm.heightPixels/2; Log.d("TAG","width" + width + "------" + "height" + height); canvas.drawCircle(width, height, mRadius, mPaint); canvas.save(); } }

最後我們在activity中使用全類名然後設定自定義屬性的值,就好了。注意名稱空間哦。第一個就是這麼簡單,好了記下來我們看第二個。
同樣先上自定義屬性:

<declare-styleable name="DrawView">
    <attr name="BallColor" format="color"/>
    <attr name="BallRadius" format="float"/>
    <attr name="BallStartX" format="float"/>
    <attr name="BallStartY" format="float"/>
</declare-styleable>

接下來是自定義變換的圓:

public class DrawView extends View {

    /*private float circleX = 40;
    private float circleY = 50;
    private float circleR = 15;*/

    private float circleX;
    private float circleY;
    private float circleR;
    private int ballColor;

    public DrawView(Context context) {
        this(context,null);
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DrawView);

        //獲取開始的X的位置屬性值
        circleX = a.getFloat(R.styleable.DrawView_BallStartX,10);
        circleY = a.getFloat(R.styleable.DrawView_BallStartY,10);
        circleR = a.getFloat(R.styleable.DrawView_BallRadius,10);
        ballColor = a.getColor(R.styleable.DrawView_BallColor,0x990000FF);

        a.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //建立畫筆
        Paint paint = new Paint();
        //設定畫筆顏色
        //paint.setColor(Color.RED);
        paint.setColor(ballColor);
        // 畫小球
        canvas.drawCircle(circleX,circleY,circleR,paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        circleX = event.getX();
        circleY = event.getY();
        circleR = circleX % circleY;  // 改變R是為了好玩
        this.invalidate();
        return true;
    }
}

使用方法和上面那個一樣。開始寫第二個時間本來是圓跟隨手指移動,但是在移動時間我突發奇想,如果能一邊移動,圓一邊變化大小應該挺好玩的吧,於是就在onTouchEvent中做了處理,雖然很簡單,但是做出來的那個效果還有效果還是很喜歡的。