初步学习自定义view

在现实世界中,我们画画需要两样东西:笔(或者任何能涂画的东西)和纸(或者任何能被画的东西),同样地,Android也给我们提供了这两样东西:Paint和Canvas,一个是画笔而另一个呢当然是画布啦~~,我们可以看到在onDraw方法中,画布Canvas作为签名被传递进来,也就是说这个画布是Android为我们准备好的,不需要你去管,当然你也可以自定义一张画布在上面绘制自己的东西并将其传递给父类,但是一般我们不建议这样去做!

首先在构造方法中实例化了一个Paint对象为其设置了抗锯齿(让图像边缘显得更圆滑光泽动感)

// 实例化画笔并打开抗锯齿        

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  

paint.setAntiAlias(true);  

注意:不建议你在draw或者layout的过程中去实例化对象,因为draw或layout的过程有可能是一个频繁重复执行的过程

我们可以用Paint的各种setter方法来设置各种不同的属性,比如setColor()设置画笔颜色,setStrokeWidth()设置描边线条,setStyle()设置画笔的样式:Paint集成了所有“画”的属性,而Canvas则定义了所有要画的东西,我们可以通过Canvas下的各类drawXXX方法绘制各种不同的东西,比如绘制一个圆drawCircle(),绘制一个圆弧drawArc(),绘制一张位图drawBitmap()等等等:

下面开始写代码了

实现目标:圆从小变大从大变小的动画实现(使用自定义view)

原理:设定一个圆的半径最大值,先画一个圆,然后不断的增大圆的半径绘制圆,当半径大于最大值时不断减小圆的半径并进行绘制

自定义圆环View

<span style="font-size:14px;">package com.example.customviewdemo;

import android.content.Context;
import android.content.res.Resources.Theme;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
/**
 * 画会动的圆环,半径从小变大
 * @author Administrator
 *
 */
public class YuanHuanView extends View implements Runnable{
	private Paint paint;
	private int radius;//半径
	private int screenWidth;
	private int screenHeight;
	public YuanHuanView(Context context, AttributeSet attrs) {
		super(context, attrs);
		//初始化画笔,打开抗锯齿
		paint=new Paint(Paint.ANTI_ALIAS_FLAG);
		/**
		 * 画笔样式分三种: 
	     * 1.Paint.Style.STROKE:描边 
	     * 2.Paint.Style.FILL_AND_STROKE:描边并填充 
	     * 3.Paint.Style.FILL:填充 
		 */
		paint.setStyle(Paint.Style.STROKE);
		paint.setColor(Color.BLUE);
		/* 
	     * 设置描边的粗细,单位:像素px 
	     * 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素 
	     */  
		paint.setStrokeWidth(10);
		//获取系统管理服务WindowManager
		WindowManager manager=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		//获取屏幕的宽高
		screenWidth=manager.getDefaultDisplay().getWidth();
		screenHeight=manager.getDefaultDisplay().getHeight();
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		//将屏幕的中点作为圆心,radius为半径画圆
		canvas.drawCircle(screenWidth/2,screenHeight/2, radius, paint);
	}
	private boolean flag=true;//用于判断半径是增大还是减小
	@Override
	public void run() {
		while(true){
			if(flag){//变大
				if(radius<200){//半径小于200,半径不断变大
					radius++;
				}else{
					flag=false;//当半径等于200的时候,让圆不断变小
				}
			}else{//变小
				if(radius>0){
					radius--;
				}else{//当半径等于0的时候,让圆不断变大
					flag=true;
				}
			}
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			postInvalidate();//更新UI
		}
	}

}
</span>

activity中代码实现

<span style="font-size:14px;">package com.example.customviewdemo;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
	private YuanHuanView yuanHuan;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		yuanHuan=(YuanHuanView) findViewById(R.id.yuanHuanView1);
		//开启线程不断画圆
		new Thread(yuanHuan).start();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
	}
}
</span>

xml布局文件

<span style="font-size:14px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.example.customviewdemo.YuanHuanView
        android:id="@+id/yuanHuanView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout></span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值