Oke, saya telah membaca dan mencari-cari, dan sekarang saya membenturkan kepala ke dinding mencoba mencari tahu. Inilah yang saya miliki sejauh ini:
package com.pockdroid.sandbox;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.widget.ImageView;
public class ShadowImageView extends ImageView {
private Rect mRect;
private Paint mPaint;
public ShadowImageView(Context context)
{
super(context);
mRect = new Rect();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setShadowLayer(2f, 1f, 1f, Color.BLACK);
}
@Override
protected void onDraw(Canvas canvas)
{
Rect r = mRect;
Paint paint = mPaint;
canvas.drawRect(r, paint);
super.onDraw(canvas);
}
@Override
protected void onMeasure(int w, int h)
{
super.onMeasure(w,h);
int mH, mW;
mW = getSuggestedMinimumWidth() < getMeasuredWidth()? getMeasuredWidth() : getSuggestedMinimumWidth();
mH = getSuggestedMinimumHeight() < getMeasuredHeight()? getMeasuredHeight() : getSuggestedMinimumHeight();
setMeasuredDimension(mW + 5, mH + 5);
}
}
Tanda "+5" dalam pengukuran di sana bersifat sementara; Dari apa yang saya pahami, saya perlu melakukan beberapa matematika untuk menentukan ukuran yang ditambahkan drop shadow ke kanvas, bukan?
Tetapi ketika saya menggunakan ini:
public View getView(int position, View convertView, ViewGroup parent) {
ShadowImageView sImageView;
if (convertView == null) {
sImageView = new ShadowImageView(mContext);
GridView.LayoutParams lp = new GridView.LayoutParams(85, 85);
sImageView.setLayoutParams(lp);
sImageView.setScaleType(ImageView.ScaleType.CENTER);
sImageView.setPadding(5,5,5,5);
} else {
sImageView = (ShadowImageView) convertView;
}
sImageView.setImageBitmap(bitmapList.get(position));
return sImageView;
}
di ImageView saya, saya masih mendapatkan ImageView biasa saat menjalankan program.
Ada pemikiran? Terima kasih.
EDIT: Jadi saya berbicara dengan RomainGuy beberapa di saluran IRC, dan saya sudah membuatnya berfungsi untuk gambar persegi panjang biasa dengan kode di bawah ini. Itu masih tidak akan menarik bayangan langsung ke transparansi bitmap saya, jadi saya masih mengerjakannya.
@Override
protected void onDraw(Canvas canvas)
{
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.omen);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
canvas.drawColor(Color.GRAY);
canvas.drawRect(50, 50, 50 + bmp.getWidth(), 50 + bmp.getHeight(), paint);
canvas.drawBitmap(bmp, 50, 50, null);
}
sumber
Jawaban:
Oke, saya tidak melihat ada jawaban lagi untuk yang satu ini, jadi apa yang akhirnya saya lakukan untuk saat ini hanyalah solusi untuk gambar persegi panjang. Saya telah menggunakan NinePatch berikut:
bersama dengan padding yang sesuai di XML:
untuk mendapatkan hasil yang cukup baik:
Tidak ideal, tetapi cukup.
sumber
Ini diambil dari presentasi Romain Guy di Devoxx, pdf yang ditemukan di sini .
Semoga ini membantu.
CATATAN
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, jika tidak, Anda tidak akan melihat bayangan Anda! (@Kontolindonesia)SetShadowLayer
sayangnya tidak bekerja dengan akselerasi perangkat keras sehingga sangat mengurangi kinerja (@Matt Wear) [1] [2]sumber
Saya percaya jawaban ini dari UIFuel
sumber
Solusi kotor saya:
hasil:
sumber
Ini dia. Setel sumber ImageView secara statis dalam xml atau secara dinamis dalam kode.
Bayangan di sini berwarna putih.
sumber
Saya berhasil menerapkan batas gradien menggunakan kode ini ..
semoga ini membantu !
sumber
Ini bekerja untuk saya ...
sumber
Berikut Implementasi dari jawaban Paul Burke :
TODO: jalankan
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
hanya jika API Level> 10sumber
Saya telah membangun jawaban di atas - https://stackoverflow.com/a/11155031/2060486 - untuk membuat bayangan di sekitar SEMUA sisi ..
Ubah warna di const sesuai keinginan Anda.
sumber
Gunakan kelas ini untuk menggambar bayangan pada bitmap
sumber
Jika Anda ingin menggunakan imageView kustom, saya sarankan Anda menggunakan yang ini
Tampilan terlihat sempurna dan tidak menggunakan gambar sembilan jalur apa pun
sumber