开发自定义View

来源:互联网 发布:羡慕别人知乎 编辑:程序博客网 时间:2024/06/01 09:02

开发自定义View

在Android中,所有的UI界面都是由View类和ViewGroup类及其子类组合而成的。其中,View类是所有UI组件的基类,而ViewGroup类是容纳这些UI组件的容器,其本身也是View类的子类,在ViewGroup类中,除了可以包含普通的View类外,还可以再次包含ViewGroup类。
一般情况下,开发Android应用程序的UI界面,都不直接使用View和ViewGroup类,而是使用这两个类的子类。例如,要显示一张图片,就可以使用View类的子类ImageView。虽然安卓提供了很多继承View类的UI组件,但在实际开发时,依然会出现不足以满足程序需要的情况。此时用户就可以通过继承View类来开发自己的组件
开发自定义的View组件大致分为以下3个步骤。
1.创建一个继承android.view.View类的View类,并且重写构造方法
2.根据需要重写相应的方法。

  public class MyRobot extends View {    private float bitmapX;    private float bitmapY;    public float getBitmapX() {        return bitmapX;    }    public void setBitmapX(float bitmapX) {        this.bitmapX = bitmapX;    }    public float getBitmapY() {        return bitmapY;    }    public void setBitmapY(float bitmapY) {        this.bitmapY = bitmapY;    }    public MyRobot(Context context) {        super(context);        bitmapX = 300;        bitmapY = 300;    }    @Override    protected void onDraw(Canvas canvas) {        Log.e("MyRobot", "onDraw被调用了");        super.onDraw(canvas);        // [1] 创建画笔        Paint paint = new Paint();        // [2] 解析资源文件生成Bitmap对象        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),                R.drawable.ic_launcher);        // [3] 绘制图像        canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint);        if (bitmap.isRecycled()) {            // 回收资源            bitmap.recycle();        }    }}  @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 关联布局文件        setContentView(R.layout.activity_main);        mFrameLayout = (FrameLayout) findViewById(R.id.myLayout);        // 创建自定义对象        myRobot = new MyRobot(MainActivity.this);        // 将其加入布局中,如果是要在XML使用则重写两个参数的构造方法        mFrameLayout.addView(myRobot);        // 设置触摸监听事件        myRobot.setOnTouchListener(new OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                myRobot.setBitmapX(event.getX());                myRobot.setBitmapY(event.getY());                // 刷新画布                myRobot.invalidate();                return true;            }        });    }
0 0
原创粉丝点击