回答編集履歴

3

コード修正

2023/04/06 08:57

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -65,7 +65,7 @@
65
65
 
66
66
  private class Dragger implements AdapterView.OnItemLongClickListener, View.OnDragListener {
67
67
  private ListView listView;
68
- private int from, x, y;
68
+ private int from;
69
69
 
70
70
  private Dragger(ListView listView) {
71
71
  this.listView = listView;
@@ -84,21 +84,15 @@
84
84
  @Override
85
85
  public boolean onDrag(View v, DragEvent event) {
86
86
  //Log.d("onDrag ****", "action="+event.getAction()+", x="+(int)event.getX()+", y="+(int)event.getY());
87
- switch(event.getAction()){
87
+ switch(event.getAction()) {
88
88
  case DragEvent.ACTION_DRAG_STARTED:
89
89
  return true;
90
90
  case DragEvent.ACTION_DROP:
91
- x = (int)event.getX();
91
+ int x = (int)event.getX();
92
- y = (int)event.getY();
92
+ int y = (int)event.getY();
93
- return true;
94
- case DragEvent.ACTION_DRAG_ENDED:
95
93
  int to = getChildPosition(x, y);
96
94
  if(to < 0) return false;
97
95
  move(from, to);
98
- return true;
99
- case DragEvent.ACTION_DRAG_EXITED:
100
- x = -1;
101
- y = -1;
102
96
  return true;
103
97
  }
104
98
  return false;

2

追加

2023/04/06 08:29

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -2,6 +2,7 @@
2
2
  透明にするのか等の細かいことは onDrawShadow を実装して自由にやってくれというのがスタンスだと思います。
3
3
 
4
4
  以下はシャドーを不透明&半分のサイズで書くものです。
5
+ 透明度に関しては startDragAndDrop のフラグに View.DRAG_FLAG_OPAQUE がありますので、どの程度自由に出来るかは分かりません。
5
6
  ```java
6
7
  import androidx.annotation.ColorInt;
7
8
  import androidx.appcompat.app.AppCompatActivity;

1

コード追加

2023/04/06 08:27

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -1,2 +1,169 @@
1
1
  onProvideShadowMetrics での shadowSize の設定は、 onDrawShadow に渡される Canvas のサイズなのではないでしょうか。
2
2
  透明にするのか等の細かいことは onDrawShadow を実装して自由にやってくれというのがスタンスだと思います。
3
+
4
+ 以下はシャドーを不透明&半分のサイズで書くものです。
5
+ ```java
6
+ import androidx.annotation.ColorInt;
7
+ import androidx.appcompat.app.AppCompatActivity;
8
+
9
+ import android.content.ClipData;
10
+ import android.graphics.*;
11
+ import android.os.Bundle;
12
+ import android.view.*;
13
+ import android.widget.*;
14
+
15
+ import java.util.*;
16
+
17
+ public class MainActivity extends AppCompatActivity {
18
+ @Override
19
+ protected void onCreate(Bundle savedInstanceState) {
20
+ super.onCreate(savedInstanceState);
21
+ setContentView(R.layout.activity_main);
22
+
23
+ ListView listView = findViewById(R.id.listView);
24
+ listView.setAdapter(new Adapter(listView));
25
+ }
26
+
27
+ private static class Adapter extends BaseAdapter {
28
+ private static class Item {
29
+ final String text1, text2;
30
+ final @ColorInt int background;
31
+ Item(String text1, String text2, @ColorInt int background) {
32
+ this.text1 = text1;
33
+ this.text2 = text2;
34
+ this.background = background;
35
+ }
36
+ }
37
+ private List<Item> dataList = new ArrayList<>(Arrays.asList(
38
+ new Item("あああ","AAA",0xffff8080),
39
+ new Item("いいい","BBB",0xff80ff80),
40
+ new Item("ううう","CCC",0xffffff80),
41
+ new Item("えええ","DDD",0xff8080ff),
42
+ new Item("おおお","EEE",0xffff80ff)
43
+ ));
44
+
45
+ private static class HalfDragShadowBuilder extends View.DragShadowBuilder {
46
+ HalfDragShadowBuilder(View view) {
47
+ super(view);
48
+ }
49
+
50
+ @Override
51
+ public void onProvideShadowMetrics(Point outShadowSize, Point outShadowTouchPoint) {
52
+ outShadowSize.set(getView().getWidth()/2, getView().getHeight()/2);
53
+ outShadowTouchPoint.set(outShadowSize.x / 2, outShadowSize.y / 2);
54
+ }
55
+
56
+ @Override
57
+ public void onDrawShadow(Canvas canvas) {
58
+ View v = getView();
59
+ Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
60
+ v.draw(new Canvas(b));
61
+ canvas.drawBitmap(Bitmap.createScaledBitmap(b, canvas.getWidth(), canvas.getHeight(), false), 0, 0, new Paint());
62
+ }
63
+ }
64
+
65
+ private class Dragger implements AdapterView.OnItemLongClickListener, View.OnDragListener {
66
+ private ListView listView;
67
+ private int from, x, y;
68
+
69
+ private Dragger(ListView listView) {
70
+ this.listView = listView;
71
+ }
72
+
73
+ @Override
74
+ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
75
+ //Log.d("onItemLongClick ****", "position="+position);
76
+ from = position;
77
+ View childView = listView.getChildAt(position);
78
+ ClipData data = ClipData.newPlainText("label", "text");
79
+ childView.startDragAndDrop(data, new HalfDragShadowBuilder(childView), childView, View.DRAG_FLAG_OPAQUE);
80
+ return true;
81
+ }
82
+
83
+ @Override
84
+ public boolean onDrag(View v, DragEvent event) {
85
+ //Log.d("onDrag ****", "action="+event.getAction()+", x="+(int)event.getX()+", y="+(int)event.getY());
86
+ switch(event.getAction()){
87
+ case DragEvent.ACTION_DRAG_STARTED:
88
+ return true;
89
+ case DragEvent.ACTION_DROP:
90
+ x = (int)event.getX();
91
+ y = (int)event.getY();
92
+ return true;
93
+ case DragEvent.ACTION_DRAG_ENDED:
94
+ int to = getChildPosition(x, y);
95
+ if(to < 0) return false;
96
+ move(from, to);
97
+ return true;
98
+ case DragEvent.ACTION_DRAG_EXITED:
99
+ x = -1;
100
+ y = -1;
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+
106
+ private int getChildPosition(int x, int y) {
107
+ Rect rect = new Rect();
108
+ for(int i=0; i<listView.getChildCount(); i++) {
109
+ listView.getChildAt(i).getHitRect(rect);
110
+ if(rect.contains(x, y)) return i;
111
+ }
112
+ return -1;
113
+ }
114
+ }
115
+
116
+ Adapter(ListView listView) {
117
+ Dragger dragger = new Dragger(listView);
118
+ listView.setOnItemLongClickListener(dragger);
119
+ listView.setOnDragListener(dragger);
120
+ }
121
+
122
+ void move(int from, int to) {
123
+ //Log.d("Adapter ***", "move: from="+from+", to="+to);
124
+ if(from < 0 || getCount() <= from || to < 0 || getCount() <= to || from == to) return;
125
+ dataList.add(to, dataList.remove(from));
126
+ notifyDataSetChanged();
127
+ }
128
+
129
+ @Override
130
+ public int getCount() {
131
+ return dataList.size();
132
+ }
133
+
134
+ @Override
135
+ public Object getItem(int position) {
136
+ return dataList.get(position);
137
+ }
138
+
139
+ @Override
140
+ public long getItemId(int position) {
141
+ return position;
142
+ }
143
+
144
+ private static class ViewHolder {
145
+ final View itemView;
146
+ final TextView text1, text2;
147
+ ViewHolder(View itemView) {
148
+ this.itemView = itemView;
149
+ text1 = itemView.findViewById(android.R.id.text1);
150
+ text2 = itemView.findViewById(android.R.id.text2);
151
+ }
152
+ }
153
+
154
+ @Override
155
+ public View getView(int position, View convertView, ViewGroup parent) {
156
+ if(convertView == null) {
157
+ convertView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false);
158
+ convertView.setTag(new ViewHolder(convertView));
159
+ }
160
+ ViewHolder vh = (ViewHolder)convertView.getTag();
161
+ Item item = dataList.get(position);
162
+ vh.text1.setText(item.text1);
163
+ vh.text2.setText(item.text2);
164
+ vh.itemView.setBackgroundColor(item.background);
165
+ return convertView;
166
+ }
167
+ }
168
+ }
169
+ ```