Как нарисовать линию над GridView программно

Я новичок в публикациях о переполнении стека, поэтому я сделаю все возможное, чтобы быть описательным здесь.

Сейчас я играю с Android Studio. Я настроил gridview (я создал свой собственный адаптер изображения), который содержит квадратные изображения, образующие сетку 5 на 6 с некоторым отступом между каждым пространством сетки. Что я хочу сделать, так это иметь возможность рисовать линию (используя холст и краску) поверх этого gridview программно.

Я просмотрел довольно много сообщений о переполнении стека, чтобы попытаться решить мою проблему, например эту: Программно нарисовать линию поверх существующего макета

Следуя инструкциям по ссылке выше ^^^, я смог создать программу, которая рисует линию над ImageView.

Но когда я использую аналогичный код в своей программе, которая пытается нарисовать линию над gridView, она просто рисует линию и ничего больше.

Вот фрагменты кода того, что я пытаюсь сделать. Это файл XML:

<LinearLayout 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"
    android:orientation="vertical">

    <!-- Game layout *er -->
    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/gridviewGame"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp"
        android:numColumns="5"
        android:stretchMode="columnWidth"
        android:gravity="center"
        />

    <com.example.ella.lazorsgame.DrawView
        android:id="@+id/paintView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

Это пользовательский код представления:

public class DrawView extends View {
    Paint paint = new Paint();
    private int strokeWidth = 8;

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint.setColor(Color.RED);
        paint.setStrokeWidth(strokeWidth);
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawLine(0, 0, 300, 300, paint);
    }

}

И здесь я рисую сетку изображений в своей основной деятельности (этот код работает сам по себе... сетка просто не отображается, когда я пытаюсь нарисовать линию сверху):

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game_setup);

        GridView gridview = (GridView) findViewById(R.id.gridviewGame);
        blockGridAdapter = new ImageAdapter(this, R.drawable.selectedblock, 30);

        // set up grid space object array *er
        for (int i = 0; i < BlockSpaces.length; i++) {
            BlockSpaces[i] = new BlockSpace(gridview, i);
        }

        // set up grid visual display on phone screen *er
        gridview.setAdapter(blockGridAdapter);

        // ------------- INITIAL GAME SETUP (block placements) -------------- *er
        blockSetup(levelSelected);

        gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                updateSelection(position);
            }
        });
    }

Спасибо за помощь! Дайте мне знать, если потребуется дополнительная информация.


person RoboTron    schedule 14.06.2015    source источник


Ответы (1)


Вы не вызываете супер метод onDraw

super.onDraw(canvas);

таким образом, единственное, что рисуется, это линия, и система не обрабатывает другие ваши представления, которые признаны недействительными и нуждаются в перерисовке!!!

проверьте это: http://developer.android.com/training/custom-views/custom-drawing.html

person Ilja KO    schedule 14.06.2015