自定義View學習-繪製一個簡單的圓
阿新 • • 發佈:2019-01-25
想把平時學到的關於自定義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中做了處理,雖然很簡單,但是做出來的那個效果還有效果還是很喜歡的。