آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ایجاد یک برش دایره ای از تصویر (حل شد)

طاهر  11 سال پیش  11 سال پیش
+7 0

برای برش تصویر بصورت زیر چطور باید عمل کرد ؟

با استفاده از کاستوم کنترلی که از imageView اکستند شده باشه .

میخوام که بصورت کاستوم کنترل باشه و موقعی که اون رو در view برنامه استفاده میکنم بصورت فوق نمایش داده بشه

تابع زیر رو با جستجو پیدا کردم ولی نتونستم ازش استفاده کنم

اگه کسی تونسته با مثال توضیح بده

 publicclassRoundedImageViewextendsImageView{publicRoundedImageView(Context context){super(context);// TODO Auto-generated constructor stub}publicRoundedImageView(Context context,AttributeSet attrs){super(context, attrs);}publicRoundedImageView(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);}@Overrideprotectedvoid onDraw(Canvas canvas){Drawable drawable = getDrawable();if(drawable ==null){return;}if(getWidth()==0|| getHeight()==0){return;}Bitmap b =((BitmapDrawable)drawable).getBitmap();Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888,true);int w = getWidth(), h = getHeight();Bitmap roundBitmap =  getCroppedBitmap(bitmap, w);
    canvas.drawBitmap(roundBitmap,0,0,null);}publicstaticBitmap getCroppedBitmap(Bitmap bmp,int radius){Bitmap sbmp;if(bmp.getWidth()!= radius || bmp.getHeight()!= radius)
        sbmp =Bitmap.createScaledBitmap(bmp, radius, radius,false);else
        sbmp = bmp;Bitmap output =Bitmap.createBitmap(sbmp.getWidth(),
            sbmp.getHeight(),Config.ARGB_8888);Canvas canvas =newCanvas(output);finalint color =0xffa19774;finalPaint paint =newPaint();finalRect rect =newRect(0,0, sbmp.getWidth(), sbmp.getHeight());

    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setDither(true);
    canvas.drawARGB(0,0,0,0);
    paint.setColor(Color.parseColor("#BAB399"));
    canvas.drawCircle(sbmp.getWidth()/2+0.7f, sbmp.getHeight()/2+0.7f,
            sbmp.getWidth()/2+0.1f, paint);
    paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(sbmp, rect, rect, paint);return output;}}
0 0
من جسارت میکنم میگم ولی قبلا اقای شیخی همچین همچین سوالی رو پرسیدن.نمیدونم این مدنظر شما هست یا نه : لینک (11 سال پیش)
0 0
در لینک درج شده هم پاسخ دقیقی ذکر نشده (11 سال پیش)
+1 0
آقا طاهر این لینک رو چک کنید احتمالاً به دردتون میخوره (11 سال پیش)
0 0
در سایت اقای کاشی زاده لینک کاملا این موضوع بحث شده و ویدوشم جالبه (11 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
سپهر  11 سال پیش
+2 0

من  از این کد استفاده کردم ، البته این کد برای زمانی مناسب هست که از لیست ویو استفاده نکنی چون زیاد کار میکشه از گوشی ممکنه کم بیاره توی لیست ویو

 ImageView mImageView = (ImageView) findViewById(R.id.profile);
        Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.profilepic);
        Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
        Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
        Canvas mCanvas = new Canvas(result);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        mCanvas.drawBitmap(original, 0, 0, null);
        mCanvas.drawBitmap(mask, 0, 0, paint);
        paint.setXfermode(null);
        mImageView.setImageBitmap(result);
        mImageView.setScaleType(ScaleType.CENTER);
        mImageView.setBackgroundResource(R.drawable.borderframe);

Borderframe

mask

profilepic

0 0
کد خوبیه ولی میخوام برای لیست ویو ازش استفاده کنم برای همین باید خیلی سبک باشه (11 سال پیش)
+1 0
برای این که سبک بشه یه راه خیلی ساده هست که میتونی دوتا عکس رو روی هم بذاری توی یه لایه relative یا frame (11 سال پیش)
پاسخ به سوال 
طاهر  11 سال پیش
+6 0

پس از کلی جستجو و کلنجار رفتن بالاخره تونستم یه کدی تهیه کنم :

فقط کافیه در ویو موردنظر یک ایمیج ویو قرار بدین :

 main.xml
<com.negahetazehco.CustomControl.CircleRoundedImageView
android:id="@+id/rounded"
android:layout_width="300dp"
android:layout_height="300dp"
android:src="@drawable/dd" />

اینم تابع موردنظر

 package com.negahetazehco.CustomControl;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;


public class CircleRoundedImageView extends ImageView {

private static int StrokeWidth = 8;
private static String StrokeColor = "#d7d7d7";


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


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


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


@Override
protected void onDraw(Canvas canvas) {

Drawable drawable = getDrawable();

if (drawable == null) {
return;
}

if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

int w = getWidth(), h = getHeight();

Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
canvas.drawBitmap(roundBitmap, 0, 0, null);

}


public static void setStrockWidth(int value) {
StrokeWidth = value;
}


public static void setStrockWidth(String value) {
StrokeColor = value;
}


public static Bitmap getCroppedBitmap(Bitmap bmp, int width) {
Bitmap sbmp;
if (bmp != null) {
if (bmp.getWidth() != width || bmp.getHeight() != width) {
float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
float factor = smallest / width;
sbmp = Bitmap.createScaledBitmap(bmp, (int) (bmp.getWidth() / factor), (int) (bmp.getHeight() / factor), false);
} else {
sbmp = bmp;
}
Bitmap output = Bitmap.createBitmap(width, width, Config.ARGB_8888);
Canvas canvas = new Canvas(output);

final int color = 0xffa19774;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, width, width);

paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setStyle(Style.FILL_AND_STROKE);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#ff0000"));

canvas.drawCircle(width / 2, width / 2, width / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);

Paint CirclePaintBg = new Paint();
CirclePaintBg.setColor(Color.parseColor(StrokeColor));
CirclePaintBg.setAntiAlias(true);
CirclePaintBg.setStrokeWidth(StrokeWidth);
CirclePaintBg.setStyle(Style.STROKE);
canvas.drawCircle(width / 2, width / 2, width / 2 - 3, CirclePaintBg);

return output;
} else {
return null;
}
}

}

0 0
اینم سنگینه برای یک لیست ویو با آیتم های زیاد (11 سال پیش)
0 0
فکر نکنم سنگین باشه یه imageView هست دیگه با یه تابع اضافی (11 سال پیش)
0 0
آقا همه کتابخونه ها شو ایمپورت کردم فقط از این خط اشتباه Rename in file میگیره --> Bitmap b = ((BitmapDrawable) drawable).getBitmap(); (11 سال پیش)
0 0
تصحیح میکنم به خاطر عدم پرانتز گذاری جلوی تابع getBitmap بود .اگه سورسشو میزاشتید تو گیت هاب بهتر بود چون سایت یکسری از کلماتو حذف میکنه . ممنون (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .