当前位置: 代码迷 >> Android >> 自定义组件实现Android简易画夹
  详细解决方案

自定义组件实现Android简易画夹

热度:82   发布时间:2016-04-28 04:58:41.0
自定义组件实现Android简易画板


??????? 实现画板功能可通过现有的ImageView组件,也可以通过自定义DrawingView组件,添加新的画板功能。二组件都继承android.view.View类。


? ? ? ? 一:DrawingView程序部分:
??????? (1)继承View类,重写构造方法。在传入参数Context、AttributeSet的方法中新建画笔对象paint。
??????? (2)重写onDraw(android.graphics.Canvas)方法:

? ? ? ? ? ? ?public void onDraw(Canvas canvas) {

? ? ? ? ? ? ? ? ?super.onDraw(canvas);

? ? ? ? ? ? ? ? //如果bitmap没有被创建,初始化一个bitmap。

? ? ? ? ? ? ? ? if (bitmap == null) {

? ? ? ? ? ? ? ? ? ? bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(),

? ? ? ? ? ? ? ? ? ? Config.ARGB_8888);//设置大小为屏幕大小,颜色为32位色。

? ? ? ? ? ? ? ? ? ??this.canvas = new Canvas(bitmap);//创建画布为缓冲绘图区bitmap。

? ? ? ? ? ? ? ? ? ? this.canvas.drawColor(Color.CYAN);//将画布的颜色填充为青色。

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? // 将bitmap对象绘制到DrawingView界面上。参数二指源区域,参数三指目标区域,用于贴图。

? ? ? ? ? ? ? ? canvas.drawBitmap(bitmap, 0, 0, paint);

? ? ? ? ? ? ? ??(在使用ImageView组建画图时,需要imageview.setImageBitmap(bitmap);将缓冲区图片设置到imageview上)

? ? ? ? ? ? }

? ? ? ? (3)重写View的触控事件。

? ? ? ? ? ? ? ? //该方法返回布尔值,应在绘图后返回ture表示事件已被成功处理。

? ? ? ? ? ? ? ? public boolean onTouchEvent(MotionEvent event) {

? ? ? ? ? ? ? ? //对事件进行分类处理。

? ? ? ? ? ? ? ? switch (event.getAction()) {

? ? ? ? ? ? ? ? case MotionEvent.ACTION_DOWN://按下触控板

? ? ? ? ? ? ? ? ? ? x1 = event.getX();

? ? ? ? ? ? ? ? ? ? y1 = event.getY();

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? case MotionEvent.ACTION_UP://离开触控板

? ? ? ? ? ? ? ? ? ? ? ? //判断当前功能并绘制相应图形。

? ? ? ? ? ? ? ? ? ? ? ? (String进行比较时,if string.equals("...");表示比较String的值相等。

? ? ? ? ? ? ? ? ? ? ? ? 而if(StringA=="...");则二者的值和地址都需要相等才能返回真。)

? ? ? ? ? ? ? ? ? ? if (shape.equals("直线")) {

? ? ? ? ? ? ? ? ? ? ? ? x2 = event.getX();

? ? ? ? ? ? ? ? ? ? ? ? y2 = event.getY();

? ? ? ? ? ? ? ? ? ? ? ? canvas.drawLine(x1, y1, x2, y2, paint);

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if(shape.equals("矩形")){

? ? ? ? ? ? ? ? ? ? ? ? x2 = event.getX();

? ? ? ? ? ? ? ? ? ? ? ? y2 = event.getY();

? ? ? ? ? ? ? ? ? ? ? ? canvas.drawRect(x1, y1, x2, y2, paint);

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? case MotionEvent.ACTION_MOVE:

? ? ? ? ? ? ? ? ? ? if (shape.equals("曲线")) {

? ? ? ? ? ? ? ? ? ? ? ? x2 = event.getX();

? ? ? ? ? ? ? ? ? ? ? ? y2 = event.getY();

? ? ? ? ? ? ? ? ? ? ? ? canvas.drawLine(x1, y1, x2, y2, paint);

? ? ? ? ? ? ? ? ? ? ? ? x1 = x2;

? ? ? ? ? ? ? ? ? ? ? ? y1 = y2;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //................

? ? ? ? ? ? ? ? //重绘

? ? ? ? ? ? ? ? this.invalidate();

? ? ? ? ? ? ? ??(invalidate();会通知区域无效,排队等待消息后重绘,若加入this.Update()则立即重绘,强调同步);

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? }?

?

? ? ? ? 二:main.xml菜单编辑部分:

? ? ? ? <item>添加选项,同类选项之间被添加在同一<menu>下。

? ? ? ??(.xml文件形式以<类型名>......</类型名>完成一次嵌套并结束。这里不应使用中文命名。)

? ? ? ? <menu xmlns:android="http://schemas.android.com/apk/res/android" >

? ? ? ? <!--表示进入菜单时的第一阶目录。其中有Color选单-->

? ? ? ? ? ? ?<item android:id="@+id/color" android:title="@string/color">

? ? ? ? ? ? ? ? ?<menu>

? ? ? ? ? ? ? ? ? ? <!--Color选单下的内容,包含了四种颜色选择-->

? ? ? ? ? ? ? ? ? ? <group android:checkableBehavior="single" android:enabled="true">

? ? ? ? ? ? ? ? ? ? ? ? <item android:id="@+id/red" android:title="@string/Red"/>

? ? ? ? ? ? ? ? ? ? ? ? <item android:id="@+id/yellow" android:title="@string/Yellow"/>

? ? ? ? ? ? ? ? ? ? ? ? <item android:id="@+id/blue" android:title="@string/Blue"/>

? ? ? ? ? ? ? ? ? ? ? ? <item android:id="@+id/black" android:title="@string/Black"/>

? ? ? ? ? ? ? ? ? ?</group>

? ? ? ? ? ? ? ? </menu>

? ? ? ? ? ? </item>

? ? ? ? 以此方法建立工具选单,画笔粗细选单。

?

? ? ? ? 三:strings.xml菜单标题对照部分:

? ? ? ? ? ? ? ?<string name="color">颜色选择</string>

? ? ? ? ? ? ? ?<string name="Red">红色</string>

? ? ? ? ? ? ? ?<string name="Yellow">黄色</string>

? ? ? ? ? ? ? ?<string name="Blue">蓝色</string>

? ? ? ? ? ? ? ?<string name="Black">黑色</string>

? ? ? ? ? ? ? ?在执行应用时将菜单中的标题改换成中文。

? ? ? ???以此方法建立工具选单,画笔粗细选单的标题对照。

?

? ? ? ? 四:MainActivity.java部分:

? ? ? ? (1)实例化一个DrawingView对象dv;

? ? ? ? (2)在onCreate(Bundle savedInstanceState)方法中获取绘制图形组件对象:

? ? ? ? ? ? ? ??dv = (DrawingView)this.findViewById(R.id.drawingView1);//通过地址访问。

? ? ? ? (3)添加菜单的方法

? ? ? ? public boolean onCreateOptionsMenu(Menu menu) {

? ? ? ? ? ? getMenuInflater().inflate(R.menu.main, menu);

? ? ? ? ? ? return true;

? ? ? ? }

? ? ? ? (4)添加菜单功能选择的方法

? ? ? ? public boolean onOptionsItemSelected(MenuItem item) {

? ? ? ? ? ? ?//将菜单中选项组建的Title转型成String

? ? ? ? ? ? String MenuName = item.getTitle().toString();

? ? ? ? ? ? //选择功能

? ? ? ? ? ? //直线

? ? ? ? ? ? if(MenuName.equals("直线")){

? ? ? ? ? ? ? ? dv.shape = "直线";

? ? ? ? ? ? }

? ? ? ? ? ? ......其余以此为例。

? ? ? ? ? ? //选择颜色

? ? ? ? ? ? //红色

? ? ? ? ? ? if(MenuName.equals("红色")){

? ? ? ? ? ? ? ? dv.paint.setColor(Color.RED);(访问格式:对象.属性.方法;)

? ? ? ? ? ? }

? ? ? ? ? ? ......其余以此为例。

? ? ? ? ? ? //选择画笔粗细

? ? ? ? ? ? //3像素宽度

? ? ? ? ? ? if(MenuName.equals("3dp")){

? ? ? ? ? ? ? ? dv.paint.setStrokeWidth(3);

? ? ? ? ? ? }

? ? ? ? ? ? (在创建item组件时,不能以数字开头命名,故创建时可命名为Dp3。)

? ? ? ? ? ? ......其余以此为例。

? ? ? ? ? ? return true;

? ? ? ? }

?

? ? ? ? 简易画板效果预览:



?

?

?

?

  相关解决方案