重写view
在界面上点哪,在哪画一个圈
重写View:重写onDraw(), 另外事件里面调用invalidate()来刷新
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
public class DrawView extends View { private static final String TAG = "DrawView"; public float currentX = 80; public float currentY = 80; Paint paint = new Paint(); public DrawView(Context context) { super(context); } public DrawView(Context context, AttributeSet set) { super(context, set); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); Log.d(TAG, "onDraw()"); paint.setColor(Color.BLUE); canvas.drawCircle(currentX, currentY, 25, paint); } @Override public boolean onTouchEvent(MotionEvent event) { currentX = event.getX(); currentY = event.getY(); Log.d(TAG, "x:" + currentX + " y:" + currentY); invalidate(); return false; } @Override protected void onFinishInflate() { super.onFinishInflate(); Log.d(TAG, "onFinishInflate"); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh);
//这里能做一些初始化的东西 Log.d(TAG, "onSizeChanged,w=" + w + ",h=" + h + ",oldw=" + oldw + ",oldh=" + oldh); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <com.example.draw.DrawView android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
04-23 02:50:51.674 14924 14924 D DrawView: onFinishInflate
04-23 02:50:51.720 14924 14924 D DrawView: onSizeChanged,w=1080,h=1533,oldw=0,oldh=0
04-23 02:50:51.732 14924 14924 D DrawView: onDraw() //系统会自动调用onDraw()一次
04-23 02:50:59.966 14924 14924 D DrawView: x:618.0 y:881.0
04-23 02:50:59.982 14924 14924 D DrawView: onDraw()
04-23 02:51:00.521 14924 14924 D DrawView: x:724.0 y:523.0
04-23 02:51:00.532 14924 14924 D DrawView: onDraw()
04-23 02:51:01.088 14924 14924 D DrawView: x:372.0 y:1077.0
04-23 02:51:01.098 14924 14924 D DrawView: onDraw()
自定义 View的常用方法:
onFinishInflate() 当View中所有的子控件 均被映射成xml后触发
onMeasure(int, int) 确定所有子元素的大小
onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发
onSizeChanged(int, int, int, int) 当view的大小发生变化时触发
onDraw(Canvas) view渲染内容的细节
onKeyDown(int, KeyEvent) 有按键按下后触发
onKeyUp(int, KeyEvent) 有按键按下后弹起时触发
onTrackballEvent(MotionEvent) 轨迹球事件
onTouchEvent(MotionEvent) 触屏事件
onFocusChanged(boolean, int, Rect) 当View获取 或失去焦点时触发
onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发
onAttachedToWindow() 当view被附着到一个窗口时触发
onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的。
onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发
以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:
@Override protected void onDraw(Canvas canvas) { //这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色 Paint paintBackground = new Paint(); paintBackground.setColor(getResources().getColor(R.color.xxx)); //从Res中找到名为xxx的color颜色定义 canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //设置当前画布的背景颜色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充,具体的 请查看Android123未来讲到的Canvas和Paint //在Canvas中我们可以实现画路径,图形,区域,线。而Paint作为绘画方 式的对象 可以设置颜色,大小,甚至字体的类型等等。 }
canvas.drawText("uu", x, y, paint); //以(x, y)为起点画字符串“uu”
paint.setTextAlign(Paint.Align.CENTER); //那就是字符的中心,是指定这个字符baseline在屏幕上的位置。

浙公网安备 33010602011771号