質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

495閲覧

[Android開発 Java] ドラッグシャドウの大きさと透明度を変えたい...!

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2023/04/04 18:45

編集2023/04/04 18:45

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
jimbe

総合スコア12644

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/04/06 09:41

ご回答ありがとうございます. つまり,View.DragShadowBuilderは指に合わせて,設定したCanvasを画面に描画するものと考えて良いでしょうか. View.DragShadowBuilder(v)で半透明なv自身が描画されるため,vの見た目をコピーしたviewがドラッグシャドウだと思っていました.
退会済みユーザー

退会済みユーザー

2023/04/06 09:52

追加の質問で恐縮ですが,機能実装のためのクラス/メソッドの使い方はどのように勉強するのでしょうか? リファレンス https://developer.android.com/reference/android/view/View.DragShadowBuilder を軽く眺めてみましたが(読み方が違うのかもしれませんし大前提としてAndroid, Javaへの理解が浅いのはありますが),リファレンスに書いてあることだけで実用的な機能の実装は難しく感じます. コツなどはありますか?
jimbe

2023/04/07 03:06 編集

>つまり,View.DragShadowBuilderは指に合わせて,設定したCanvasを画面に描画するものと考えて良いでしょうか. Builder と付いているように、(Canvas に)"シャドーを作るモノ"という感じでしょうか。その Canvas を表示するのは別の誰かでしょう。 また、「Touch」と付いた変数名はあるもののそれはシャドー内の"支点"を表すのであって、それが「指」と関係するとは限りません。あまり一般化してしまっても分かり難くなりますが、逆に限定するのも思考の幅を狭めます。 シャドーは一般的には対象を少し透明ぽくしたものが使われるため、 View.DragShadowBuilder に基本的なものとして作ってあるということでしょう。 >機能実装のためのクラス/メソッドの使い方はどのように勉強するのでしょうか? ソフトウェアに限らずモノを作る際には部品を集めてさらに部品とするのを繰り返すことで最終的な完成品になります。逆に完成品を部品毎に考えて行って最も細かい部品として何が必要でどう組み合わせるのかを考えることも出来ます。 ネジ一本を見て「これは役に立たない」と判断するでしょうか。 画面に点を1つ表示するだけのメソッドで、点を並べて線が引けて、線を並べて面を塗れます。点を任意のパターンで並べられれば文字が書け、文字を並べて文章が書けます。 身の回りにある様々なモノが何をどう組み合わせることで成り立っているのか、何も難しいモノを考える必要は無く、例えばモノとしての本は何かで印刷した紙を何かで纏めているもので、どう印刷しているのか、何で纏めているのか、なぜそれらを使ったのか等を追っていけば様々なレベルで様々なコトが関係しているはずです。 リファレンスはただ「こうである」ということが書いてあるだけです。それをどう組み合わせれば何が出来るのかこそモノ作りの醍醐味です。 ネットに散在する情報をどう集めそこから何を得てどうするのかは、待っていても得られません。教科書通りに文字を追って読むのではなく、歴史物語のようにその存在の背景まで想像しながら心に刻んでいくと、どこかでアレとかコレとかが結びつく瞬間があるかもしれません。
退会済みユーザー

退会済みユーザー

2023/04/07 11:20

ご回答ありがとうございます. 機能を完成した全体としてしか捉えていませんでしたが,たしかに,様々なものが集まり一つの機能として成立していますね. Androidに限らず,いくつかのリファレンスを軽く眺めたことはありますが,整然としすぎて意味を汲み取れませんでしたが ”” ネジ一本を見て「これは役に立たない」と判断するでしょうか。 画面に点を1つ表示するだけのメソッドで、点を並べて線が引けて、線を並べて面を塗れます。点を任意のパターンで並べられれば文字が書け、文字を並べて文章が書けます。 ・・・ リファレンスはただ「こうである」ということが書いてあるだけです。それをどう組み合わせれば何が出来るのかこそモノ作りの醍醐味です。”” という言葉で,リファレンスの使い方が少しだけわかりました.このことを意識して,勉強/開発を進めていきたいと思います! 素敵な考え方を教えてくださり,ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問