上一次我们讲了一堆实现自己定义控件的理论基础。列举了View类一些能够重写的方法,我们对这些方法的重写是我们继承View类来派生自己定义控件的关键
我通过一个最简单的样例给大家展示了这一个过程,不管是多么复杂的自己定义控件。思路总是这样子的,可是由于我们只重写了onDraw方法使得大家认为怪怪的。作为一个控件,我们竟然还要为了他的实现为其添加麻烦的监听,这就不能叫做控件了。
以下再给大家介绍一个常常重写的方法法:publicboolean onTouchEvent (MotionEvent event)
通过这种方法,我们就把写在Activity的监听部分内置在控件内部了。这才干叫做一个完整的控件,其功能是建立一片区域,并当中包括一个能够依据手指触摸而改变位置的小球。
以下我们来看一下这个触摸事件方法:
publicboolean onTouchEvent (MotionEvent event)
Added in API level 1
Implement this method to handle touch screen motionevents.
If this method is used to detect click actions, it isrecommended that the actions be performed by implementing and calling performClick().
This willensure consistent system behavior, including:
obeying click sound preferences
dispatching OnClickListener calls
handling ACTION_CLICK whenaccessibility
features are enabled
Parameters
event |
The motion event. |
Returns
True if the event was handled, false otherwise.
这样我们就能够把我们刚才在Activity的类中做的工作放到我们的自己定义控件中来实现
仅仅要去掉刚才的setter 和 getter 然后重写这个触摸事件的方法就能够了:
public boolean onTouchEvent(MotionEvent motionevent){ CircleX = motionevent.getX(); CircleY = motionevent.getY(); this.invalidate(); return true;
这样我们仅仅须要再简单的在xml中调用,一切都愉快的攻克了!
这个样例我会和第一个一并放在一起的。就和我之前写的适配器的教程一样。源代码我会整理再一起再给大家。第二个程序我凝视就不那么注意啦……不是我懒。近期比較忙(事实上就是懒)
以下我贴一下代码:
Activity的代码:
package com.example.customcomponentsdemo.Activity; import com.example.customcomponentsdemo.R; import android.app.Activity; import android.content.Context; import android.os.Bundle; public class MoveBallActivity2 extends Activity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_moveball2); } }
简单介绍了好多有木有!
自己定义View版本号2的代码:
package com.example.customcomponentsdemo.component; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class DrawView2 extends View{ private Context context; private float CircleX = 100; private float CircleY = 100; private float CircleR = 10; public DrawView2(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } @Override public void onDraw(Canvas canves){ Paint paint = new Paint(); paint.setColor(Color.BLUE); canves.drawCircle(CircleX, CircleY, CircleR, paint); } @Override public boolean onTouchEvent(MotionEvent motionevent){ CircleX = motionevent.getX(); CircleY = motionevent.getY(); this.invalidate(); return true; } }
这样就简洁了好多!
还有xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是MoveBall的Demo 版本号2" android:textColor="@color/white" > </TextView> <com.example.customcomponentsdemo.component.DrawView2 android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" > </com.example.customcomponentsdemo.component.DrawView2> </LinearLayout>
这样我们的第二个教程也就先到这里了,这次的主题不是这个ontouch方法,而是要告诉大家,自己定义控件的核心是重写这些方法,并加入所须要的逻辑。View的方法不多也不少。我就用这个样例给大家抛砖引玉一下,希望大家在自己定义自己的控件并选择了继承View这条路时。要花时间去了解和理解这些方法的重写方法,这是十分重要的。 下次再给大家介绍一下假设自己定义的View须要有自己定义的属性我们该怎样处理。下一讲也将会是这个系列完结篇了,由于自己定义View之路还有非常远,我也没有举一些非常难的样例。我觉得基础知识仅仅有这些,学习了这些之后自己定义控件的基础也就讲完了,剩下的是大家在基础之上发挥了。之后假设有比較好的样例我还会继续补充的。
源代码我会在下次一并发给大家链接的,希望大家能学到一些东西~
另外我也是学生,假设有写的不好或者有错误的地方还请大家多多不吝赐教,谢谢!