Android
पिकासो
खोज…
परिचय
पिकासो Android के लिए एक छवि पुस्तकालय है। यह स्क्वायर द्वारा बनाया और बनाए रखा गया है। यह बाहरी स्थानों से चित्र प्रदर्शित करने की प्रक्रिया को सरल बनाता है। पुस्तकालय प्रक्रिया के हर चरण को संभालता है, प्रारंभिक HTTP अनुरोध से छवि के कैशिंग तक। कई मामलों में, इस स्वच्छ पुस्तकालय को लागू करने के लिए कोड की केवल कुछ पंक्तियों की आवश्यकता होती है।
टिप्पणियों
पिकासो एंड्रॉइड के लिए एक शक्तिशाली छवि डाउनलोडिंग और कैशिंग लाइब्रेरी है।
अपने प्रोजेक्ट में लाइब्रेरी जोड़ने के लिए इस उदाहरण का अनुसरण करें ।
वेबसाइटें:
अपने Android प्रोजेक्ट में पिकासो लाइब्रेरी को जोड़ना
Gradle।
dependencies {
compile "com.squareup.picasso:picasso:2.5.2"
}
Maven:
<dependency>
<groupId>com.squareup.picasso</groupId>
<artifactId>picasso</artifactId>
<version>2.5.2</version>
</dependency>
प्लेसहोल्डर और एरर हैंडलिंग
पिकासो वैकल्पिक सुविधाओं के रूप में डाउनलोड और त्रुटि प्लेसहोल्डर दोनों का समर्थन करता है। यह भी डाउनलोड परिणाम को संभालने के लिए कॉलबैक प्रदान करता है।
Picasso.with(context)
.load("YOUR IMAGE URL HERE")
.placeholder(Your Drawable Resource) //this is optional the image to display while the url image is downloading
.error(Your Drawable Resource) //this is also optional if some error has occurred in downloading the image this image would be displayed
.into(imageView, new Callback(){
@Override
public void onSuccess() {}
@Override
public void onError() {}
});
त्रुटि प्लेसहोल्डर को दिखाए जाने से पहले एक अनुरोध तीन बार वापस लिया जाएगा।
पुन: आकार और घूर्णन
Picasso.with(context)
.load("YOUR IMAGE URL HERE")
.placeholder(DRAWABLE RESOURCE) // optional
.error(DRAWABLE RESOURCE) // optional
.resize(width, height) // optional
.rotate(degree) // optional
.into(imageView);
पिकासो के साथ परिपत्र अवतार
यहाँ एक उदाहरण पिकासो सर्किल ट्रांसफ़ॉर्म क्लास है जो मूल पर आधारित है, एक पतली सीमा के अलावा, और स्टैकिंग के लिए एक वैकल्पिक विभाजक के लिए कार्यक्षमता भी शामिल है:
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import com.squareup.picasso.Transformation;
public class CircleTransform implements Transformation {
boolean mCircleSeparator = false;
public CircleTransform(){
}
public CircleTransform(boolean circleSeparator){
mCircleSeparator = circleSeparator;
}
@Override
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
if (squaredBitmap != source) {
source.recycle();
}
Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
Canvas canvas = new Canvas(bitmap);
BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG);
paint.setShader(shader);
float r = size/2f;
canvas.drawCircle(r, r, r-1, paint);
// Make the thin border:
Paint paintBorder = new Paint();
paintBorder.setStyle(Style.STROKE);
paintBorder.setColor(Color.argb(84,0,0,0));
paintBorder.setAntiAlias(true);
paintBorder.setStrokeWidth(1);
canvas.drawCircle(r, r, r-1, paintBorder);
// Optional separator for stacking:
if (mCircleSeparator) {
Paint paintBorderSeparator = new Paint();
paintBorderSeparator.setStyle(Style.STROKE);
paintBorderSeparator.setColor(Color.parseColor("#ffffff"));
paintBorderSeparator.setAntiAlias(true);
paintBorderSeparator.setStrokeWidth(4);
canvas.drawCircle(r, r, r+1, paintBorderSeparator);
}
squaredBitmap.recycle();
return bitmap;
}
@Override
public String key() {
return "circle";
}
}
यहाँ एक छवि लोड करते समय इसका उपयोग कैसे किया जाता है (यह मानते हुए कि this
एक गतिविधि संदर्भ है, और url
एक स्ट्रिंग है जो छवि के url को लोड करने के लिए है):
ImageView ivAvatar = (ImageView) itemView.findViewById(R.id.avatar);
Picasso.with(this).load(url)
.fit()
.transform(new CircleTransform())
.into(ivAvatar);
परिणाम:
विभाजक के साथ उपयोग के लिए, शीर्ष छवि के लिए निर्माता को true
दें:
ImageView ivAvatar = (ImageView) itemView.findViewById(R.id.avatar);
Picasso.with(this).load(url)
.fit()
.transform(new CircleTransform(true))
.into(ivAvatar);
परिणाम (एक फ्रेम-आउट में दो ImageView):
पिकासो में कैश अक्षम करें
Picasso.with(context)
.load(uri)
.networkPolicy(NetworkPolicy.NO_CACHE)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.placeholder(R.drawable.placeholder)
.into(imageView);
बाहरी संग्रहण से चित्र लोड हो रहा है
String filename = "image.png";
String imagePath = getExternalFilesDir() + "/" + filename;
Picasso.with(context)
.load(new File(imagePath))
.into(imageView);
पिकासो का उपयोग करके छवि को बिटमैप के रूप में डाउनलोड करना
यदि आप Picasso
बाद Bitmap
रूप में छवि डाउनलोड करना चाहते हैं तो निम्नलिखित कोड आपकी मदद करेंगे:
Picasso.with(mContext)
.load(ImageUrl)
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
// Todo: Do something with your bitmap here
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
पिकासो का उपयोग करके छवि अनुरोध रद्द करना
कुछ मामलों में हमें डाउनलोड पूरा होने से पहले पिकासो में एक छवि डाउनलोड अनुरोध को रद्द करने की आवश्यकता है।
यह विभिन्न कारणों से हो सकता है, उदाहरण के लिए यदि छवि को पूरा करने से पहले माता-पिता ने किसी अन्य दृश्य में परिवर्तन किया हो।
इस स्थिति में, आप cancelRequest()
विधि का उपयोग करके छवि डाउनलोड अनुरोध को रद्द कर सकते हैं:
ImageView imageView;
//......
Picasso.with(imageView.getContext()).cancelRequest(imageView);
Html.fromHtml के लिए ImageGetter के रूप में पिकासो का उपयोग करना
Html.fromHtml के लिए ImageGetter के रूप में पिकासो का उपयोग करना
public class PicassoImageGetter implements Html.ImageGetter {
private TextView textView;
private Picasso picasso;
public PicassoImageGetter(@NonNull Picasso picasso, @NonNull TextView textView) {
this.picasso = picasso;
this.textView = textView;
}
@Override
public Drawable getDrawable(String source) {
Log.d(PicassoImageGetter.class.getName(), "Start loading url " + source);
BitmapDrawablePlaceHolder drawable = new BitmapDrawablePlaceHolder();
picasso
.load(source)
.error(R.drawable.connection_error)
.into(drawable);
return drawable;
}
private class BitmapDrawablePlaceHolder extends BitmapDrawable implements Target {
protected Drawable drawable;
@Override
public void draw(final Canvas canvas) {
if (drawable != null) {
checkBounds();
drawable.draw(canvas);
}
}
public void setDrawable(@Nullable Drawable drawable) {
if (drawable != null) {
this.drawable = drawable;
checkBounds();
}
}
private void checkBounds() {
float defaultProportion = (float) drawable.getIntrinsicWidth() / (float) drawable.getIntrinsicHeight();
int width = Math.min(textView.getWidth(), drawable.getIntrinsicWidth());
int height = (int) ((float) width / defaultProportion);
if (getBounds().right != textView.getWidth() || getBounds().bottom != height) {
setBounds(0, 0, textView.getWidth(), height); //set to full width
int halfOfPlaceHolderWidth = (int) ((float) getBounds().right / 2f);
int halfOfImageWidth = (int) ((float) width / 2f);
drawable.setBounds(
halfOfPlaceHolderWidth - halfOfImageWidth, //centering an image
0,
halfOfPlaceHolderWidth + halfOfImageWidth,
height);
textView.setText(textView.getText()); //refresh text
}
}
//------------------------------------------------------------------//
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
setDrawable(new BitmapDrawable(Application.getContext().getResources(), bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
setDrawable(errorDrawable);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
setDrawable(placeHolderDrawable);
}
//------------------------------------------------------------------//
}
}
उपयोग सरल है:
Html.fromHtml(textToParse, new PicassoImageGetter(picasso, textViewTarget), null);
पहले ऑफ़लाइन डिस्क कैश का प्रयास करें, फिर ऑनलाइन जाएं और छवि प्राप्त करें
सबसे पहले ऐप मॉड्यूल के ग्रेडेल बिल्ड फ़ाइल में ओकेहट्प जोड़ें
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'
फिर एक क्लास एक्सटेंडिंग एप्लिकेशन बनाएं
import android.app.Application;
import com.squareup.picasso.OkHttpDownloader;
import com.squareup.picasso.Picasso;
public class Global extends Application {
@Override
public void onCreate() {
super.onCreate();
Picasso.Builder builder = new Picasso.Builder(this);
builder.downloader(new OkHttpDownloader(this,Integer.MAX_VALUE));
Picasso built = builder.build();
built.setIndicatorsEnabled(true);
built.setLoggingEnabled(true);
Picasso.setSingletonInstance(built);
}
}
निम्नानुसार इसे मेनिफेस्ट फ़ाइल में जोड़ें:
<application
android:name=".Global"
.. >
</application>
सामान्य उपयोग
Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
//Offline Cache hit
}
@Override
public void onError() {
//Try again online if cache failed
Picasso.with(getActivity())
.load(imageUrl)
.error(R.drawable.header)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
//Online download
}
@Override
public void onError() {
Log.v("Picasso","Could not fetch image");
}
});
}
});