安卓系统使帆布覆盖半屏幕

1 人关注

我试图创建一个应用程序,在画布上画一些简单的线条。我想让画布占据屏幕的前50%,留下屏幕的后50%用于按钮之类的东西。我现在使用的是 setContentView(canvas); ,它可以使画布占到屏幕的100%。

android
user6334610
发布于 2017-09-18
2 个回答
Thracian
Thracian
发布于 2021-12-17
0 人赞同

你可以创建一个扩展视图的类,并在该视图的 onDraw() 方法中进行绘图。将该视图添加到你的布局中,并选择任何宽度或高度。

我如何将它添加到我的布局中,并选择宽度和高度?
Let's say you created a class MyView extends View in com.example.views java folder.You add this to xml as adding another view(TextView, imageView etc) <com.example.views.MyView> or instantiating it in runtime. You can search adding custom view on runtime or xml, you will get lots of examples. Invoking myView.invalidate() invokes onDraw(Canvas canvas) of that view and you can draw anything you wish same way you draw to a canvas.
ggorlen
ggorlen
发布于 2021-12-17
0 人赞同

而不是 setContentView ,使用你的布局XML来创建一个视图来容纳画布,如图所示 在layout/main.xml中引用内部类View时出错 .

在这之后,就需要使用一个技术,在 android:layout_height 为屏幕尺寸的50%。 如:

<LinearLayout ...>
    class="com.example.foo.FooActivity$Drawer"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="horizontal"
</LinearLayout>

你也可以使用,比如说,android:layout_weight="0.7""0.3",将画布/按钮容器分别设置为屏幕的70%和30%。

这里有一个最小的、完整的例子。

Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:keepScreenOn="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:background="#f00"
        class="com.example.foo.FooActivity$Drawer"
        android:background="#00f"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
    <LinearLayout
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        <Button
            android:id="@+id/start"
            android:text="@string/start"
            android:textSize="20sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:backgroundTint="#f0f"
            android:padding="10dp"
            android:layout_margin="20dp"
        <Button
            android:id="@+id/stop"
            android:text="@string/stop"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:backgroundTint="#f0f"
            android:padding="10dp"
            android:layout_margin="20dp"
    </LinearLayout>
</LinearLayout>

Activity:

package com.example.foo;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;
public class FooActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_foo);
    public static class Drawer extends View {
        private static Paint paint;
        private static int viewWidth;
        private static int viewHeight;
        public Drawer(Context con, AttributeSet attr) {
            super(con, attr);
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setStyle(Paint.Style.FILL);
        // https://stackoverflow.com/a/9718512/6243352
        @Override
        protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
            super.onSizeChanged(xNew, yNew, xOld, yOld);
            viewWidth = xNew;
            viewHeight = yNew;
        @Override
        protected void onDraw(final Canvas c) {
            super.onDraw(c);
            paint.setARGB(255, 0, 0, 0);
            int cx = viewWidth / 2;
            int cy = viewHeight / 2;
            c.drawCircle(cx, cy,viewWidth / 4, paint);