ড্রপ শ্যাডো সহ কাস্টম ইমেজভিউ


97

ঠিক আছে, আমি চারপাশে পড়া এবং সন্ধান করা হয়েছে, এবং এখন এটি বের করার চেষ্টা করে প্রাচীরের বিরুদ্ধে মাথা ঘুরাচ্ছি। আমার এখন পর্যন্ত যা আছে তা এখানে:

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);
}

}

পরিমাপের "+5" অস্থায়ী হিসাবে রয়েছে; আমি যা বুঝতে পেরেছি সে থেকে ড্রপ শেডো ক্যানভাসে যুক্ত হওয়া আকার নির্ধারণ করতে আমার কিছু গণিত করা দরকার, তাই না?

তবে আমি যখন এটি ব্যবহার করি:

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;
}

আমার ইমেজভিউতে, আমি যখন প্রোগ্রামটি চালাচ্ছি তখনও আমি একটি সাধারণ চিত্র দেখুন iew

কোন চিন্তা? ধন্যবাদ

সম্পাদনা: সুতরাং আমি রোমানগুয়ের সাথে আইআরসি চ্যানেলে কিছু লোকের সাথে কথা বললাম এবং আমি এখন এটি নীচের কোড সহ সরল আয়তক্ষেত্রাকার চিত্রগুলির জন্য কাজ করছি। এটি এখনও আমার বিটম্যাপের স্বচ্ছতার দিকে ছায়াটি আঁকবে না, সুতরাং আমি এখনও এটি নিয়ে কাজ করছি।

@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);       
}

"এটি এখন সরল আয়তক্ষেত্রাকার চিত্রগুলির জন্য কাজ করছে" ... সুতরাং এটি অ-আয়তক্ষেত্রাকার চিত্রগুলির জন্য কাজ করে না, এবং তারপরে আমি ধরে নিচ্ছি এটি 9 প্যাচ-চিত্রগুলির জন্যও কাজ করে না, সঠিক? আপনি কি ইতিমধ্যে এটি কাজ পেয়েছেন? রোমেন গাইয়ের এই পদ্ধতির কারণ এখনও আমার পরীক্ষায় আমার পক্ষে কাজ করে না।
ম্যাথিয়াস কনরাডেট

হুঁ, মজার প্রশ্ন। আমি মনে করি আপনি সম্ভবত আপনার 9-প্যাচ ব্যবহার করে এমন দৃষ্টিভঙ্গি নিতে পেরেছেন এবং এটিকে ফ্রেম-লেআউটে মুড়িয়ে রাখতে পারেন এবং ফ্রেমলআউটকে ড্রপ ছায়া 9-প্যাচ ব্যাকগ্রাউন্ড দিতে পারেন। তবে হ্যাঁ, এটি কেবল আয়তক্ষেত্রাকার চিত্রগুলির জন্যই কাজ করে, কারণ 9-প্যাচের পক্ষে স্বচ্ছতার রূপগুলি অনুসরণ করার কোনও উপায় নেই। দুর্ভাগ্যক্রমে আমি এর থেকে ভাল সমাধান খুঁজে পাইনি, তবে, এর পরে আমি সত্যিই আবার চেষ্টা করিনি।
কেভিন কপক

উত্তর:


121

ঠিক আছে, আমি এই উত্তর সম্পর্কে আর কোনও উত্তর প্রত্যাশা করি না, সুতরাং আমি এখনই যা শেষ করেছি তা কেবল আয়তক্ষেত্রাকার চিত্রগুলির সমাধান। আমি নিম্নলিখিত নাইনপ্যাচটি ব্যবহার করেছি:

বিকল্প পাঠ

এক্সএমএলে উপযুক্ত প্যাডিং সহ:

<ImageView
        android:id="@+id/image_test"
        android:background="@drawable/drop_shadow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="6px"
        android:paddingTop="4px"
        android:paddingRight="8px"
        android:paddingBottom="9px"
        android:src="@drawable/pic1"
        />

মোটামুটি ভাল ফলাফল পেতে:

বিকল্প পাঠ

আদর্শ নয়, তবে তা করবে।


17
ড্রপ_স্যাডো .9.png হিসাবে png সংরক্ষণ করতে ভুলবেন না
এনপাইক

4
বাহ, কোডে এটি করার চেষ্টা করে আমি অনেক বেশি সময় ব্যয় করেছি। আরও অনেক মার্জিত সমাধান!
নিক রেইমান

চিত্রগুলি কীভাবে দেখার সীমাটি সামঞ্জস্য করতে হবে?
স্ট্যাক ওভারফ্লো হয়েছে

আপনি যদি সঠিকভাবে তৈরি করেন তবে ড্র 9 প্যাচ সরঞ্জামটি ব্যবহার করার দরকার নেই।
কেভিন কপোকক

4
আরও কিছু ধাপে ধাপে টিউটোরিয়ালটি এখানে পাওয়া যাবে: sapandiwakar.in/…
বার্ট বার্গ

104

এটি ডিভোএক্সএক্স, পিডিএফ-এ রোমেন গাইয়ের উপস্থাপনা থেকে নেওয়া হয়েছে

Paint mShadow = new Paint(); 
// radius=10, y-offset=2, color=black 
mShadow.setShadowLayer(10.0f, 0.0f, 2.0f, 0xFF000000); 
// in onDraw(Canvas) 
canvas.drawBitmap(bitmap, 0.0f, 0.0f, mShadow);

আশাকরি এটা সাহায্য করবে.

মন্তব্য

  1. মধুচক্রের জন্য ভুলে যাবেন না এবং উপরে আপনাকে অনুরোধ করতে হবে setLayerType(LAYER_TYPE_SOFTWARE, mShadow) , অন্যথায় আপনি আপনার ছায়া দেখতে পাবেন না! (@ দিমিত্রি_বাইচেঙ্কো)
  2. SetShadowLayerদুর্ভাগ্যক্রমে হার্ডওয়্যার ত্বরণ নিয়ে কাজ করে না তাই এটি পারফরমেন্সগুলি (@ ম্যাট পরিধান) হ্রাস করে [1] [2]

আমি অবশ্যই পরে এটি চেষ্টা করব! পিডিএফ জন্য ধন্যবাদ, আকর্ষণীয় স্টাফ মত দেখাচ্ছে। এই উপস্থাপনা ভিডিওটি কি অনলাইনে দেখার জন্য উপলব্ধ?
কেভিন কপোকক

14
হানিকম্ব এবং তারপরে উপস্থাপন সেট লাইয়ারটাইপ (LAYER_TYPE_SOFTWARE, এমশেডো) এর জন্য ভুলে যাবেন না। না হলে আপনার ছায়া দেখতে পাবেন না।
Dmytro Boichenko

4
দুর্ভাগ্যক্রমে setShadowLayer হার্ডওয়্যার ত্বরণ নিয়ে কাজ করে না।
ম্যাট পরিধান

আপনি আকারগুলিতেও একটি পেইন্ট প্রয়োগ করেন, তাই ছায়া স্তর তাদের জন্য কাজ করে। তবে এটি কোনও আকারের অভ্যন্তরীণ 'গর্তগুলিতে প্রয়োগ করা হবে না।
স্ট্র্যা

4
ডিভোএক্সএক্স লিঙ্কটি মারা গেছে
joao2fast4u

14

আমি ইউআইফুয়েল থেকে এই উত্তর বিশ্বাস করি

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

     <!-- Drop Shadow Stack -->
     <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#00CCCCCC" />
        </shape>
    </item>
     <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#10CCCCCC" />
        </shape>
    </item>
     <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#20CCCCCC" />
        </shape>
    </item>
     <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#30CCCCCC" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#50CCCCCC" />
        </shape>
    </item>

    <!-- Background -->
    <item>
    <shape>
            <solid android:color="@color/white" />
        <corners android:radius="3dp" />
    </shape>
    </item>
</layer-list>

12

আমার নোংরা সমাধান:

private static Bitmap getDropShadow3(Bitmap bitmap) {

    if (bitmap==null) return null;
    int think = 6;
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    int newW = w - (think);
    int newH = h - (think);

    Bitmap.Config conf = Bitmap.Config.ARGB_8888;
    Bitmap bmp = Bitmap.createBitmap(w, h, conf);
    Bitmap sbmp = Bitmap.createScaledBitmap(bitmap, newW, newH, false);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Canvas c = new Canvas(bmp);

    // Right
    Shader rshader = new LinearGradient(newW, 0, w, 0, Color.GRAY, Color.LTGRAY, Shader.TileMode.CLAMP);
    paint.setShader(rshader);
    c.drawRect(newW, think, w, newH, paint);

    // Bottom
    Shader bshader = new LinearGradient(0, newH, 0, h, Color.GRAY, Color.LTGRAY, Shader.TileMode.CLAMP);
    paint.setShader(bshader);
    c.drawRect(think, newH, newW  , h, paint);

    //Corner
    Shader cchader = new LinearGradient(0, newH, 0, h, Color.LTGRAY, Color.LTGRAY, Shader.TileMode.CLAMP);
    paint.setShader(cchader);
    c.drawRect(newW, newH, w  , h, paint);


    c.drawBitmap(sbmp, 0, 0, null);

    return bmp;
}

ফলাফল: এখানে চিত্র বর্ণনা লিখুন


এটি সবসময় নীল ছায়া দেয়!
অনিমেষ মঙ্গলা

9

এই তুমি কোডে গতিশীলভাবে xML এ চিত্রাবলীর উত্স সেট করুন।

ছায়া এখানে সাদা।

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content">

    <View android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:background="@android:color/white" android:layout_alignLeft="@+id/image"
        android:layout_alignRight="@id/image" android:layout_alignTop="@id/image"
        android:layout_alignBottom="@id/image" android:layout_marginLeft="10dp"
        android:layout_marginBottom="10dp" />

    <ImageView android:id="@id/image" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:src="..."
        android:padding="5dp" />

</RelativeLayout>

অবশ্যই আমি যা খুঁজছি তা নয়। আমি একটি প্রকৃত রেন্ডার ড্রপ ছায়া চাই যা স্বচ্ছ হয়ে যায়; এটি আমাকে আমার চিত্রের পিছনে একটি সাদা বাক্স দেবে।
কেভিন কপক

9
@ কেকপপক - এই উত্তরটি হ্রাস করার দরকার নেই - এটি আসলে খুব খারাপ ছিল না।
ক্যাস্পার হারমার

4

আমি এই কোডটি ব্যবহার করে গ্রেডিয়েন্ট বর্ডার প্রয়োগ করতে পারি ..

public static Bitmap drawShadow(Bitmap bitmap, int leftRightThk, int bottomThk, int padTop) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    int newW = w - (leftRightThk * 2);
    int newH = h - (bottomThk + padTop);

    Bitmap.Config conf = Bitmap.Config.ARGB_8888;
    Bitmap bmp = Bitmap.createBitmap(w, h, conf);
    Bitmap sbmp = Bitmap.createScaledBitmap(bitmap, newW, newH, false);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Canvas c = new Canvas(bmp);

    // Left
    int leftMargin = (leftRightThk + 7)/2;
    Shader lshader = new LinearGradient(0, 0, leftMargin, 0, Color.TRANSPARENT, Color.BLACK, TileMode.CLAMP);
    paint.setShader(lshader);
    c.drawRect(0, padTop, leftMargin, newH, paint); 

    // Right
    Shader rshader = new LinearGradient(w - leftMargin, 0, w, 0, Color.BLACK, Color.TRANSPARENT, TileMode.CLAMP);
    paint.setShader(rshader);
    c.drawRect(newW, padTop, w, newH, paint);

    // Bottom
    Shader bshader = new LinearGradient(0, newH, 0, bitmap.getHeight(), Color.BLACK, Color.TRANSPARENT, TileMode.CLAMP);
    paint.setShader(bshader);
    c.drawRect(leftMargin -3, newH, newW + leftMargin + 3, bitmap.getHeight(), paint);
    c.drawBitmap(sbmp, leftRightThk, 0, null);

    return bmp;
}

আশাকরি এটা সাহায্য করবে !


2

এটি আমার পক্ষে কাজ করে ...

public class ShadowImage extends Drawable {

Bitmap bm;

@Override
public void draw(Canvas canvas) {

    Paint mShadow = new Paint();
    Rect rect = new Rect(0,0,bm.getWidth(), bm.getHeight());

    mShadow.setAntiAlias(true);
    mShadow.setShadowLayer(5.5f, 4.0f, 4.0f, Color.BLACK);

    canvas.drawRect(rect, mShadow);
    canvas.drawBitmap(bm, 0.0f, 0.0f, null);

}

public ShadowImage(Bitmap bitmap) {
    super();
    this.bm = bitmap;
} ... }

2

এখানে পল বার্কের উত্তর বাস্তবায়ন :

public class ShadowImageView extends ImageView {

    public ShadowImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ShadowImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ShadowImageView(Context context) {
        super(context);
    }

    private Paint createShadow() {
        Paint mShadow = new Paint();

        float radius = 10.0f;
        float xOffset = 0.0f;
        float yOffset = 2.0f;

        // color=black
        int color = 0xFF000000;
        mShadow.setShadowLayer(radius, xOffset, yOffset, color);


        return mShadow;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint mShadow = createShadow();
        Drawable d = getDrawable();
        if (d != null){
            setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
            Bitmap bitmap = ((BitmapDrawable) getDrawable()).getBitmap();
            canvas.drawBitmap(bitmap, 0.0f, 0.0f, mShadow);
        } else {
            super.onDraw(canvas);
        }

    };

}

টোডো: setLayerType(LAYER_TYPE_SOFTWARE, mShadow);কেবলমাত্র API স্তর> 10 হলে কার্যকর করুন ute


দুঃখিত, অসীম লুপটি একটি রিয়েল ক্লাস দ্বারা ডাকা হয়েছিল
রান

প্রশ্ন সম্পাদিত না হওয়া পর্যন্ত আমি ক্যান্সার করি না। কেবল কোনও ছোট পরিবর্তন করুন, আমাকে জানান এবং তারপরে আমি আবারও উপকৃত হব।
রানলুপ

0

আমি উপরের উত্তরটি তৈরি করেছি - https://stackoverflow.com/a/11155031/2060486 - সমস্ত পক্ষের চারদিকে ছায়া তৈরি করতে ..

 private static final int GRAY_COLOR_FOR_SHADE = Color.argb(50, 79, 79, 79);

// this method takes a bitmap and draws around it 4 rectangles with gradient to create a
// shadow effect.
public static Bitmap addShadowToBitmap(Bitmap origBitmap) {
    int shadowThickness = 13; // can be adjusted as needed
    int bmpOriginalWidth = origBitmap.getWidth();
    int bmpOriginalHeight = origBitmap.getHeight();
    int bigW = bmpOriginalWidth + shadowThickness * 2; // getting dimensions for a bigger bitmap with margins
    int bigH = bmpOriginalHeight + shadowThickness * 2;
    Bitmap containerBitmap = Bitmap.createBitmap(bigW, bigH, Bitmap.Config.ARGB_8888);
    Bitmap copyOfOrigBitmap = Bitmap.createScaledBitmap(origBitmap, bmpOriginalWidth, bmpOriginalHeight, false);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Canvas canvas = new Canvas(containerBitmap); // drawing the shades on the bigger bitmap
    //right shade - direction of gradient is positive x (width)
    Shader rightShader = new LinearGradient(bmpOriginalWidth, 0, bigW, 0, GRAY_COLOR_FOR_SHADE,
            Color.TRANSPARENT, Shader.TileMode.CLAMP);
    paint.setShader(rightShader);
    canvas.drawRect(bigW - shadowThickness, shadowThickness, bigW, bigH - shadowThickness, paint);
    //bottom shade - direction is positive y (height)
    Shader bottomShader = new LinearGradient(0, bmpOriginalHeight, 0, bigH, GRAY_COLOR_FOR_SHADE,
            Color.TRANSPARENT, Shader.TileMode.CLAMP);
    paint.setShader(bottomShader);
    canvas.drawRect(shadowThickness, bigH - shadowThickness, bigW - shadowThickness, bigH, paint);
    //left shade - direction is negative x
    Shader leftShader = new LinearGradient(shadowThickness, 0, 0, 0, GRAY_COLOR_FOR_SHADE,
            Color.TRANSPARENT, Shader.TileMode.CLAMP);
    paint.setShader(leftShader);
    canvas.drawRect(0, shadowThickness, shadowThickness, bigH - shadowThickness, paint);
    //top shade - direction is negative y
    Shader topShader = new LinearGradient(0, shadowThickness, 0, 0, GRAY_COLOR_FOR_SHADE,
            Color.TRANSPARENT, Shader.TileMode.CLAMP);
    paint.setShader(topShader);
    canvas.drawRect(shadowThickness, 0, bigW - shadowThickness, shadowThickness, paint);
    // starting to draw bitmap not from 0,0 to get margins for shade rectangles
    canvas.drawBitmap(copyOfOrigBitmap, shadowThickness, shadowThickness, null);
    return containerBitmap;
}

আপনি ফিট হিসাবে দেখতে কনস্টে রঙ পরিবর্তন করুন।


0

বিটম্যাপে ছায়া আঁকতে এই শ্রেণিটি ব্যবহার করুন

public class ShadowGenerator {

    // Percent of actual icon size
    private static final float HALF_DISTANCE = 0.5f;
    public static final float BLUR_FACTOR = 0.5f/48;

    // Percent of actual icon size
    private static final float KEY_SHADOW_DISTANCE = 1f/48;
    public static final int KEY_SHADOW_ALPHA = 61;

    public static final int AMBIENT_SHADOW_ALPHA = 30;

    private static final Object LOCK = new Object();
    // Singleton object guarded by {@link #LOCK}
    private static ShadowGenerator sShadowGenerator;

    private  int mIconSize;

    private final Canvas mCanvas;
    private final Paint mBlurPaint;
    private final Paint mDrawPaint;
    private final Context mContext;

    private ShadowGenerator(Context context) {
        mContext = context;
        mIconSize = Utils.convertDpToPixel(context,63);
        mCanvas = new Canvas();
        mBlurPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        mBlurPaint.setMaskFilter(new BlurMaskFilter(mIconSize * BLUR_FACTOR, Blur.NORMAL));
        mDrawPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
    }

    public synchronized Bitmap recreateIcon(Bitmap icon) {
        mIconSize = Utils.convertDpToPixel(mContext,3)+icon.getWidth();
        int[] offset = new int[2];
        Bitmap shadow = icon.extractAlpha(mBlurPaint, offset);
        Bitmap result = Bitmap.createBitmap(mIconSize, mIconSize, Config.ARGB_8888);
        mCanvas.setBitmap(result);

        // Draw ambient shadow
        mDrawPaint.setAlpha(AMBIENT_SHADOW_ALPHA);
        mCanvas.drawBitmap(shadow, offset[0], offset[1], mDrawPaint);

        // Draw key shadow
        mDrawPaint.setAlpha(KEY_SHADOW_ALPHA);
        mCanvas.drawBitmap(shadow, offset[0], offset[1] + KEY_SHADOW_DISTANCE * mIconSize, mDrawPaint);

        // Draw the icon
        mDrawPaint.setAlpha(255);
        mCanvas.drawBitmap(icon, 0, 0, mDrawPaint);

        mCanvas.setBitmap(null);
        return result;
    }



    public static ShadowGenerator getInstance(Context context) {

        synchronized (LOCK) {
            if (sShadowGenerator == null) {
                sShadowGenerator = new ShadowGenerator(context);
            }
        }
        return sShadowGenerator;
    }

}

-1

কাস্টম imageView ব্যবহার করতে চান তাহলে, আমি তোমাকে ব্যবহার সুপারিশ এই এক

দেখুন নিখুঁত চেহারা এবং কোনও নয় টি চিত্র ব্যবহার করবেন না

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.