DrawingView перед GridView — Android

#java #android #gridview #drawing

#java #Android #просмотр сетки #рисование

Вопрос:

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

Я подумываю о том, чтобы попытаться получить GridView за drawingView . Когда ваш палец проходит по элементам в GridView, точка (созданная в DrawingView) следует за вашим пальцем и меняет цвет по мере прохождения через элементы.

Пока у меня есть точка, которая следует за вашим пальцем по экрану. Теперь мне нужно заставить его менять цвета при перемещении по разным частям. Когда я пытаюсь поместить тестовый GridView за DrawingView, GridView отображается впереди. Я пробовал .bringToFront(); на Java и FrameLayout в XML, но безрезультатно.

Каким бы я хотел, чтобы это было:

Изображение GridView (оно было бы невидимым в приложении)

Изображение точки, следующей за пальцем, когда он движется вдоль сетки:

(В идеале то, что выглядит как щелчок в gif, должно быть перетаскиванием)

Вот мой MainActivity.java код:

 public class MainActivity extends Activity {

drawingView dview;
GridView gridview;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    dview = new drawingView(this);

    setContentView(dview);

    setContentView(R.layout.activity_activity1);
    dview.bringToFront();

    final GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));
    gridview.setVisibility(GridView.VISIBLE);

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

            ImageView tv = (ImageView) gridview.getChildAt(position);
            tv.setImageResource(R.drawable.touch); //
            tv.setVisibility(ImageView.INVISIBLE);

        }
    });
}
  

Мой drawingView.java файл:

 public class drawingView extends View implements OnTouchListener {

static int x, y, r = 0, g = 0, b = 0;
final static int radius = 30;
Paint big;
List<Point> points = new ArrayList<Point>();

public drawingView(Context context) {

    // for the dot that follows your finger
    big = new Paint();
    big.setAntiAlias(true);
    big.setARGB(100, 255, 255, 255);
    setBackgroundResource(R.drawable.background);

    setFocusable(true);
    this.setOnTouchListener(this);

}

@Override
// creating dot that follows your finger
public void draw(Canvas canvas) {
    super.draw(canvas);
    canvas.drawCircle(x, y, radius, big);
    for (Point p : points) {
        canvas.drawCircle(p.x, p.y, 10, small);
    }
    invalidate();
}

@Override
public boolean onTouch(View view, MotionEvent event) {
    view.setVisibility(View.VISIBLE);

    big.setARGB(255, 113, 113, 113);

    x = (int) event.getX() - (radius / 2);
    y = (int) event.getY() - (radius / 2);
    randColor();

    int eventaction = event.getAction();
    switch (eventaction) {
    case MotionEvent.ACTION_UP:
        big.setARGB(0, 0, 0, 0);
        setBackgroundResource(R.drawable.background);
        invalidate();
        break;
    }
    return true;
}

public void randColor() {
    r = 255;
    g = 0;
    b = 0;
}

}
  

And finally my ImageAdapter:

 public class ImageAdapter extends BaseAdapter {
private Context mContext;

public ImageAdapter(Context c) {
    mContext = c;
}

public int getCount() {
    return mThumbIds.length;
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {
        imageView = new ImageView(mContext);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    return imageView;

}

public Integer[] mThumbIds = {R.drawable.images...};
} 
  

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

Редактировать

мой activity_activity1.xml макет:

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@drawable/background"
tools:context=".Activity1" >

<GridView
    android:id="@ id/gridview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnWidth="33dp"
    android:gravity="center"
    android:height="90dp"
    android:horizontalSpacing="0dp"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="0dp"
    android:color="#00000000" >
</GridView>


</FrameLayout>
  

Ответ №1:

Попробуйте это

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@drawable/background"
tools:context=".Activity1" >

<GridView
    android:id="@ id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="33dp"
    android:gravity="center"
    android:height="90dp"
    android:horizontalSpacing="0dp"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="0dp"
    android:color="#00000000" >
</GridView>
<RelativeLayoutandroid:layout_width="fill_parent"
     android:layout_height="fill_parent"  android:id="@ id/drawingViewHolder">
</RelativeLayout>
  

Комментарии:

1. Я пробовал это не так давно, отредактировал его с помощью моего quesiton, затем повторно отредактировал обратно в свой старый XML-файл, потому что это не сработало. Спасибо, что все же попытались.

Ответ №2:

Вы выполняете setContentView() дважды; поэтому действие будет принимать setContentView(R.layout.activity_activity1); Вместо этого возьмите один относительный макет в качестве setContenView действия и в нем сначала добавьте свой GridView, а после этого добавьте один линейный или относительный макет. Таким образом, оба вида будут располагаться друг над другом. Затем создайте экземпляр вашего чертежного вида и добавьте его объект к вашему верхнему виду.

Комментарии:

1. Я изменил свой xml на то, как вы объяснили, и изменил setContentView. Я добавил xml (см. РЕДАКТИРОВАНИЕ), но он все еще оставляет меня с GridView сверху.