回答編集履歴
3
コード修正
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
|
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
追加
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
コード追加
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
|
+
```
|