Android 自定义随手指移动的小球

  • Android自定义view通过继承系统的View并重写部分方法来满足自己的特定需要。下面的这些方法可能需要被重写:   
      onMeasure() 当需要检测View组件及其子组件的大小时的回调方法
      onLayout() 当该组件需要分配其子组件的位置、大小时的回调方法
      onTouchEvent 当发生触屏事件时
      onDraw() 当组件将要绘制它的内容时
      onKeyDown 当按下某个键盘时
      onKeyUp 当松开某个键盘时
      onTrackballEvent 当发生轨迹球事件时
      onSizeChange() 当该组件的大小被改变时
      onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后调用的方法
      onWindowFocusChanged(boolean) 当该组件得到、失去焦点时
      onAttachedToWindow() 当把该组件放入到某个窗口时
      onDetachedFromWindow() 当把该组件从某个窗口上分离时触发的方法
      onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发的方法
    Android 自定义随手指移动的小球_第1张图片
    具体的举一个简单的例子来说明。圆形和文字跟随触摸事件移动的一个简单的自定义view

    • 实现上面的效果我们大致需要分成这几步
  • 在res/values/ 下建立一个attrs.xml 来声明自定义view的属性
  • 一个继承View并复写部分函数的自定义view的类
  • 一个展示自定义view 的容器界面
    1. 自定义view命名为myView,一定要和class文件名相同。它有一个属性值,格式为color
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="myView">
        <attr name="TextColor" format="color"/>
    </declare-styleable>        
</resources>

2.在自定义view类中实现其构造函数(用于初始获得view的属性配置)和复写onDraw和onTouchEvent。

public class myView extends View{
    //定义画笔和初始位置
    Paint p = new Paint();
    public float currentX = 50;
    public float currentY = 50;
    public int textColor;

    public myView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //获取资源文件里面的属性,由于这里只有一个属性值,不用遍历数组,直接通过R文件拿出color值
        //把属性放在资源文件里,方便设置和复用
        TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.myView);
        textColor = array.getColor(R.styleable.myView_TextColor,Color.BLACK);
        array.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画一个蓝色的圆形
        p.setColor(Color.BLUE);
        canvas.drawCircle(currentX,currentY,30,p);
        //设置文字和颜色,这里的颜色是资源文件values里面的值
        p.setColor(textColor);
        canvas.drawText("BY finch",currentX-30,currentY+50,p);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {


        currentX = event.getX();
        currentY = event.getY();
        invalidate();//重新绘制图形
        return true;
    }
}

这里通过不断的更新当前位置坐标和重新绘制图形实现效果,要注意的是使用TypedArray后一定要记得recycle().
否则会对下次调用产生影响。

Android 自定义随手指移动的小球_第2张图片
3.把myView放在activity_main.xml里面,当然也可以在代码中通过addview函数加到布局中。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:myview="http://schemas.android.com/apk/res-auto" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="finch.scu.cn.myview.MainActivity">


    <finch.scu.cn.myview.myView  android:layout_width="match_parent" android:layout_height="match_parent" myview:TextColor="#ff0000" />
</RelativeLayout>

这里 xmlns:前缀=”http://schemas.android.com/apk/res/包名(或res-auto)” ,
前缀:TextColor=”#ff0000”。如果不申明命名空间属性就会提示错误。

这里写图片描述

4.最后是MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 具体的view要根据具体的需求来,比如我们要侧滑删除的listview我们可以继承listview,监听侧滑事件,显示删除按钮实现功能。

你可能感兴趣的:(android)