简体   繁体   English

为什么Android自定义视图中没有调用onDraw?

[英]Why is the onDraw Not Being Called in Custom View for Android?

I am developing in Android Canvas . 我在Android Canvas开发。

But the onDraw() has not called after invalidate(); onDraw()invalidate();之后没有调用invalidate();

In the layout.xml layout.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.wen.MainActivity">

    <com.wen.Drawpath_view
        android:id="@+id/view_path"
        android:layout_weight="0.7"
        android:layout_width="match_parent"
        android:layout_height="0dp"/>

    <RelativeLayout
        android:layout_weight="0.3"
        android:layout_width="match_parent"
        android:layout_height="0dp">

        <Button
            android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </RelativeLayout>

</LinearLayout>

In the MainActivity.java MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private static final String TAG = "MainActivity";
    private Drawpath_view View_path;
    private Button test_btn;

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

        View_path = findViewById(R.id.view_path);
        View_path = new Drawpath_view(MainActivity.this);

        test_btn = findViewById(R.id.test);
        test_btn.setOnClickListener(this);



        View_path.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {

                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

                View_path.getViewTreeObserver().removeOnPreDrawListener(this);
               View_path.setMinimumHeight(View_path.getHeight());
                View_path.setMinimumWidth(View_path.getWidth());

                return true;

            }
        });
    }


    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.test){

            View_path.Testdraw();

        }
    }
}

In the customer View . 在客户View

    public class Drawpath_view extends View {

        private static final String TAG = "view";
        private Paint paint;
        private Path path = new Path();

        public Drawpath_view(Context context) {
            super(context);
            setWillNotDraw(false);
            initView();
        }

        public Drawpath_view(Context context, AttributeSet attrs) {
            super(context, attrs);
        }


        private void initView() {
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setDither(true);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.GREEN);
            paint.setStrokeWidth(3);
        }

        public void Testdraw(){
            Log.d(TAG,"draw");
            path.moveTo(60,60);
            path.lineTo(460,460);
            invalidate();
        }

        @Override
        protected void onDraw(Canvas canvas) {
            Log.d(TAG,"onDraw");
            super.onDraw(canvas);
            canvas.drawPath(path,paint);
        }
    }

When I click the button in Activity. 当我单击Activity中的按钮时。 It will call 它会打电话

        View_path.Testdraw();

But the onDraw in Drawpath_view has not been called. 但是没有调用Drawpath_viewonDraw Did I missing something ? 我错过了什么吗? Thanks in advance. 提前致谢。

You can remove View_path = new Drawpath_view(MainActivity.this); 您可以删除View_path = new Drawpath_view(MainActivity.this); from your code, as you already attached view in xml. 来自您的代码,因为您已经在xml中附加了视图。

默认情况下,所有ViewGroup子类都不调用它们的onDraw方法,您将通过在View_path上调用setWillNotDraw(false)来启用它。

Add setWillNotDraw(false); initView(); 添加setWillNotDraw(false); initView(); setWillNotDraw(false); initView(); into the second constructor as well. 进入第二个构造函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM