快速入门自定义View

Debbie ·
更新时间:2024-11-10
· 578 次阅读

目录

实现自定义View的三种方式

方式1: 扩展 -- 对现有控件进行扩展

方式2: 组合 -- 将不同的控件组合在一起形成新的控件

方式3: 重写 -- 通过重写来实现全新的控件

自定义View与Activity的交互:回调

 


Android提供了很多的 View,但有时候并不能满足需求,这个时候就需要自己来设计 View 。通常需要重写 onDraw() 方法来绘制需要显示的内容。

本文转自: https://www.jianshu.com/p/369f66035666 

本文不会详细描述,已经有很多成熟的文章了,但好记性不如烂笔头,大致描述下我所关注到的(本篇不包含View的绘制流程,仅仅是如何进行自定义View)

好文(系列)推荐:https://blog.csdn.net/carson_ho/article/details/62037696  (我也赶紧去学习一波)

不贴详细代码了,代码已经上传:  https://github.com/cl18652469346/ViewProject
附上ViewProject的效果图

    

实现自定义View的三种方式 扩展 -- 对现有控件进行扩展 组合 -- 将不同的控件组合在一起形成新的控件 重写 -- 通过重写来实现全新的控件 方式1: 扩展 -- 对现有控件进行扩展

    主要:  super.onDraw(canvas); 的前后进行需要内容的绘制。
                 Tips: 可参照ViewProject中的CustomTextView.java

方式2: 组合 -- 将不同的控件组合在一起形成新的控件

     1. 自定义属性 (自定义属性后,在布局中使用CustomView时可设置所需要的数据,提高代码易读性)
         attrs.xml 中进行属性的声明

        xml中使用MultiChoiceView

       MultiChoiceView中如何获取属性值

private int iconSize; private int viewArea; private CharSequence imagePointsS[]; public MultiChoiceView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.MultiChoiceView); resloveTypedArray(typedArray); typedArray.recycle(); setWillNotDraw(false); // 解决onDraw不执行 // initView(); } private void resloveTypedArray(TypedArray typedArray) { iconSize = typedArray.getInt(R.styleable.MultiChoiceView_iconSize_,0); viewArea = typedArray.getInt(R.styleable.MultiChoiceView_viewArea_,0); imagePointsS = typedArray.getTextArray(R.styleable.MultiChoiceView_imagePoints); }

   2. 组合控件
      
我所知道的两种方式:
       (1)布局文件中加入其他所需要的原生控件后,在onLayout方法中使用

getChildAt(i).setLayoutParams(layoutParams[i]);

      (2)在构造方法中,使用

LayoutParams leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE); addView(leftButton, leftParams); // 重点

组合控件可参照:AppView.java/MultiChoiceView.java/MyTopBar.java
 

方式3: 重写 -- 通过重写来实现全新的控件

       看例子即可, 参照MyView.java

自定义本身的理解有限,不对的指摘,谢谢。


自定义View与Activity的交互:回调
// 目的:自定义View某个点击事件向传输数据给Activity (广播等方式也是可以的,但回调方式更佳) // 第一步: 自定义View private AppIconListener appIconListener; public interface AppIconListener{ void onAppIconClick(int Index); // 可根据需要传递各种数据类型 } public void setAppIconListener(AppIconListener listener) { appIconListener = listener; } appIcon.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { appIconListener.onAppIconClick(1); // 调用Activity中接口实现的onAppIconClick方法 } }); // 第二步: Activity或者Fragment (1)public class MainActivity extends AppCompatActivity implements AppView.AppIconListener (2)实现接口定义的方法 @Override public void onAppIconClick(int Index) { appView.setAppIcon(ApplicationUtil.getIcon(this,"com.android.settings")); }   11061104 原创文章 119获赞 26访问量 26万+ 关注 私信 展开阅读全文
作者:11061104



view 自定义view

需要 登录 后方可回复, 如果你还没有账号请 注册新账号