转载请注明出处:http://blog.csdn.net/mr_leixiansheng/article/details/53520190
初学者了解自定义View很好的练习
【安卓初学|随手指滑动小球】1、新建MyDraw类并继承View,重写onDrwa画出你想要的控件
package com.example.administrator.draw;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
/**
* Created by Administrator on 2016/12/8.
*/public class MyDraw extends View {
float X = 200;
float Y = 200;
float R = 40;
float centerX;
float centerY;
public MyDraw(Context context) {
super(context);
}//获取屏幕高度宽度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int measureWidth = MeasureSpec.getSize(widthMeasureSpec);
int measureHeigt = MeasureSpec.getSize(heightMeasureSpec);
//获取屏幕中心点
centerX = measureWidth/2;
centerY = measureHeigt/2;
}@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//创建画笔
Paint paint = new Paint();
//设置画笔颜色
paint.setColor(Color.BLUE);
//画圆
canvas.drawCircle(X,Y,R,paint);
//重设画笔颜色
paint.setColor(Color.BLUE);
//设置画笔粗细
paint.setStrokeWidth(20);
canvas.drawLine(centerX, centerY, X, Y, paint);
}
}
2、在布局文件中添加id ,是为了在主程序中可以把自定义控件加到布局文件中
3、主程序中把自定义控件加到布局文件中,并设置触摸监听
package com.example.administrator.draw;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取布局容器
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.root);
//创建MyDraw组件
final MyDraw myDraw = new MyDraw(this);
//自定义组件最小高度宽度
myDraw.setMinimumHeight(500);
myDraw.setMinimumWidth(300);
//设置监听
myDraw.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
myDraw.X = motionEvent.getX();
myDraw.Y = motionEvent.getY();
//重画
myDraw.invalidate();
return true;
}
});
//myDraw自定义组件添加到布局文件
linearLayout.addView(myDraw);
}
}
Kotlin写法:
package com.leixiansheng.kotlintestimport android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.Log
import android.view.View
import android.view.ViewGroup/**
* Created by Leixiansheng on 2018/11/15.
*/
class MyDraw(context:Context) :View(context) {val TAG: String = "MyDraw"
var w: Float = 200f
var h: Float = 200f
val r: Float = 40f
var centerX: Float = 0f
var centerY: Float = 0foverride fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
centerX = MeasureSpec.getSize(widthMeasureSpec)/2.toFloat()
centerY = MeasureSpec.getSize(heightMeasureSpec)/2.toFloat()
Log.i(TAG, "centerX:${centerX},centerY:${centerY}")
}override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint()
paint.color = Color.BLUE
canvas.drawCircle(w, h, r, paint)paint.color = Color.BLUE
paint.strokeWidth = 20f
canvas.drawLine(centerX, centerY, w, h, paint)
}
}
package com.leixiansheng.kotlintestimport android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.MotionEvent
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getScreen()val myDraw = MyDraw(this)
myDraw.minimumHeight = 50
myDraw.minimumWidth = 300
myDraw.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View?, event: MotionEvent): Boolean {
myDraw.w = event.x
myDraw.h = event.y
myDraw.invalidate()
return true
}
})
root.addView(myDraw)
}private fun getScreen() {
val displayMetrics = DisplayMetrics()windowManager.defaultDisplay.getMetrics(displayMetrics)
val w = displayMetrics.widthPixels
val h = displayMetrics.heightPixelstv.setText("w:${w},h:${h}")
}
}