#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
сверху.