Android开发Android开发经验谈Android技术知识

自定义View开发笔记(ing)

2019-09-14  本文已影响0人  凌川江雪

最近拜读一本书——《Android自定义控件开发入门与实战》,感慨良多,实为佳作,这里做做笔记摘录,写写自己的心得,作巩固分享之用;

画弧原理

    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) {
        throw new RuntimeException("Stub!");
    }

    public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint) {
        throw new RuntimeException("Stub!");
    }
相关阅读:

单词普及

postInvalidate()、invalidate()之别

关于addView()、removeView()

关于add、remove的速度
public class MainActivity extends AppCompatActivity {

    private LinearLayout ll_nextParent;
    private SpiderView spiderViewOri;
    private LinearLayout.LayoutParams layoutParams;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        configCustomViews(0);
    }

    private void initViews() {

        ll_nextParent = findViewById(R.id.ll_nextParent);

        layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);

        ll_nextParent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //经过这个测试,这里的删除添加是毫秒级别的,
                // 添加之后删除的速度人眼分辨不出

                Toast.makeText(MainActivity.this, "shanchu", Toast.LENGTH_SHORT).show();
                ll_nextParent.removeView(spiderViewOri);

//                TextView test = new TextView(MainActivity.this);
//                test.setText("sdadasdasdada");
//                ll_nextParent.addView(test);

                Toast.makeText(MainActivity.this, "tianjia", Toast.LENGTH_SHORT).show();
                ll_nextParent.addView(spiderViewOri, layoutParams);
            }
        });
    }


    private void configCustomViews(int drawId) {
        switch (drawId) {
            case 0:
                spiderViewOri = new SpiderView(this);
                ll_nextParent.addView(spiderViewOri, layoutParams);
                break;

            case 1:
                break;

            default:
        }
    }

}

关于报错

Bug.1

场景:主布局中,
LinearLayout1下套ScrollView,
ScrollView下套LinearLayout2,
LinearLayout2中添加复杂的自定义View,
比如SpiderView

此时如果不做任何处理的话,
运行时一般那个复杂的自定义View是 不会被渲染出来的,
并且会报下面这个错:
Skipped xxx frames! The application may be doing too much work on its main thread
跳帧过多,程序在主线程中做了太多事情了,需要优化逻辑

关于自定义控件的宽高

所有的自定义控件在被引入布局时,
layout_width和layout_height属性的值默认都是match_parent,
当然可以通过测量控件大小以使用wrap_content

自定义组件引入

有xml引入和动态添加两种方法;

如何通过文件名拿到对应的资源ID


getIdentifier()函数的完整声明如下:










上一篇下一篇

猜你喜欢

热点阅读