Java
1private static class DragShadow extends View.DragShadowBuilder { 2 public DragShadow(View v) { 3 super(v); 4 } 5 @Override 6 public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { 7 int width = getView().getWidth(); 8 int height = getView().getHeight(); 9 shadowSize.set( 10 (int)(width*1.5), 11 (int)(height*1.5) 12 ); 13 shadowTouchPoint.set( 14 (int)(width/0.9), 15 (int)(height/0.9) 16 ); 17 } 18 19 }
上記のコードでドラッグシャドウを作ると,シャドウの位置は変わりますが,サイズと透明度が変わりません.(透明度はそもそも何に対して設定すればいいのかがわかりませんが)
元のViewと相似(+不透明)なドラッグシャドウを作る場合でも,Cnavasなどを使って作らないといけないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
onProvideShadowMetrics での shadowSize の設定は、 onDrawShadow に渡される Canvas のサイズなのではないでしょうか。
透明にするのか等の細かいことは onDrawShadow を実装して自由にやってくれというのがスタンスだと思います。
以下はシャドーを不透明&半分のサイズで書くものです。
透明度に関しては startDragAndDrop のフラグに View.DRAG_FLAG_OPAQUE がありますので、どの程度自由に出来るかは分かりません。
java
1import androidx.annotation.ColorInt; 2import androidx.appcompat.app.AppCompatActivity; 3 4import android.content.ClipData; 5import android.graphics.*; 6import android.os.Bundle; 7import android.view.*; 8import android.widget.*; 9 10import java.util.*; 11 12public class MainActivity extends AppCompatActivity { 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 ListView listView = findViewById(R.id.listView); 19 listView.setAdapter(new Adapter(listView)); 20 } 21 22 private static class Adapter extends BaseAdapter { 23 private static class Item { 24 final String text1, text2; 25 final @ColorInt int background; 26 Item(String text1, String text2, @ColorInt int background) { 27 this.text1 = text1; 28 this.text2 = text2; 29 this.background = background; 30 } 31 } 32 private List<Item> dataList = new ArrayList<>(Arrays.asList( 33 new Item("あああ","AAA",0xffff8080), 34 new Item("いいい","BBB",0xff80ff80), 35 new Item("ううう","CCC",0xffffff80), 36 new Item("えええ","DDD",0xff8080ff), 37 new Item("おおお","EEE",0xffff80ff) 38 )); 39 40 private static class HalfDragShadowBuilder extends View.DragShadowBuilder { 41 HalfDragShadowBuilder(View view) { 42 super(view); 43 } 44 45 @Override 46 public void onProvideShadowMetrics(Point outShadowSize, Point outShadowTouchPoint) { 47 outShadowSize.set(getView().getWidth()/2, getView().getHeight()/2); 48 outShadowTouchPoint.set(outShadowSize.x / 2, outShadowSize.y / 2); 49 } 50 51 @Override 52 public void onDrawShadow(Canvas canvas) { 53 View v = getView(); 54 Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 55 v.draw(new Canvas(b)); 56 canvas.drawBitmap(Bitmap.createScaledBitmap(b, canvas.getWidth(), canvas.getHeight(), false), 0, 0, new Paint()); 57 } 58 } 59 60 private class Dragger implements AdapterView.OnItemLongClickListener, View.OnDragListener { 61 private ListView listView; 62 private int from; 63 64 private Dragger(ListView listView) { 65 this.listView = listView; 66 } 67 68 @Override 69 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 70 //Log.d("onItemLongClick ****", "position="+position); 71 from = position; 72 View childView = listView.getChildAt(position); 73 ClipData data = ClipData.newPlainText("label", "text"); 74 childView.startDragAndDrop(data, new HalfDragShadowBuilder(childView), childView, View.DRAG_FLAG_OPAQUE); 75 return true; 76 } 77 78 @Override 79 public boolean onDrag(View v, DragEvent event) { 80 //Log.d("onDrag ****", "action="+event.getAction()+", x="+(int)event.getX()+", y="+(int)event.getY()); 81 switch(event.getAction()) { 82 case DragEvent.ACTION_DRAG_STARTED: 83 return true; 84 case DragEvent.ACTION_DROP: 85 int x = (int)event.getX(); 86 int y = (int)event.getY(); 87 int to = getChildPosition(x, y); 88 if(to < 0) return false; 89 move(from, to); 90 return true; 91 } 92 return false; 93 } 94 95 private int getChildPosition(int x, int y) { 96 Rect rect = new Rect(); 97 for(int i=0; i<listView.getChildCount(); i++) { 98 listView.getChildAt(i).getHitRect(rect); 99 if(rect.contains(x, y)) return i; 100 } 101 return -1; 102 } 103 } 104 105 Adapter(ListView listView) { 106 Dragger dragger = new Dragger(listView); 107 listView.setOnItemLongClickListener(dragger); 108 listView.setOnDragListener(dragger); 109 } 110 111 void move(int from, int to) { 112 //Log.d("Adapter ***", "move: from="+from+", to="+to); 113 if(from < 0 || getCount() <= from || to < 0 || getCount() <= to || from == to) return; 114 dataList.add(to, dataList.remove(from)); 115 notifyDataSetChanged(); 116 } 117 118 @Override 119 public int getCount() { 120 return dataList.size(); 121 } 122 123 @Override 124 public Object getItem(int position) { 125 return dataList.get(position); 126 } 127 128 @Override 129 public long getItemId(int position) { 130 return position; 131 } 132 133 private static class ViewHolder { 134 final View itemView; 135 final TextView text1, text2; 136 ViewHolder(View itemView) { 137 this.itemView = itemView; 138 text1 = itemView.findViewById(android.R.id.text1); 139 text2 = itemView.findViewById(android.R.id.text2); 140 } 141 } 142 143 @Override 144 public View getView(int position, View convertView, ViewGroup parent) { 145 if(convertView == null) { 146 convertView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false); 147 convertView.setTag(new ViewHolder(convertView)); 148 } 149 ViewHolder vh = (ViewHolder)convertView.getTag(); 150 Item item = dataList.get(position); 151 vh.text1.setText(item.text1); 152 vh.text2.setText(item.text2); 153 vh.itemView.setBackgroundColor(item.background); 154 return convertView; 155 } 156 } 157}
投稿2023/04/06 07:55
編集2023/04/06 08:57総合スコア13318
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2023/04/06 09:41
退会済みユーザー
2023/04/06 09:52
2023/04/07 03:06 編集
退会済みユーザー
2023/04/07 11:20