1聯網權限
2dependencies
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.7'
package com.hisense;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import com.hisense.test.R;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
public class ConstrantActivity extends AppCompatActivity {
private ImageView img;
// 網絡圖檔的連結位址
private final static String PATH = "http://pic1.win4000.com/wallpaper/c/53cdd1f7c1f21.jpg";
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_constrant);
img = (ImageView) findViewById(R.id.img);
}
public void show(View view) {
//上層
Observable.just(PATH)
//path變為bitmap 2
.map(new Function() {
@NonNull @Override
public Bitmap apply(@NonNull String path) throws Exception {
try {
Thread.sleep(2000); // 睡眠2秒鐘
URL url = new URL(path);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000); // 設定請求連接配接時長 5秒
int responseCode = httpURLConnection.getResponseCode(); // 才開始 request 拿到伺服器的響應 200成功 404有問題 ...
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = httpURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
})
//加水印
.map(new Function() {
@SuppressLint("ResourceAsColor") @NonNull @Override
public Bitmap apply(@NonNull Bitmap bitmap) throws Exception {
Paint paint = new Paint();
paint.setColor(R.color.purple_200);
paint.setTextSize(150);
Bitmap 青島印 = drawTextToBitmap(bitmap, "青島印", paint, 100, 200);
return 青島印;
}
})
.map(new Function() {
@NonNull @Override
public Bitmap apply(@NonNull Bitmap bitmap) throws Exception {
System.out.println("日志記錄即将顯示水印bitmap = " + bitmap);
return bitmap;
}
})
//給聯網耗時操作配置設定異步線程 3
.subscribeOn(Schedulers.io())
給顯示圖檔的終點配置設定android主線程 4
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
//關聯起點和終點(訂閱) 1
@Override public void onSubscribe(Disposable d) {
// 顯示加載框
progressDialog = new ProgressDialog(ConstrantActivity.this);
progressDialog.setTitle("RXJava Derry run 正在加載中..");
progressDialog.show();
}
//接收上層的響應(目前層) 5
@Override public void onNext(Bitmap s) {
img.setImageBitmap(s);
}
@Override public void onError(Throwable e) {
}
//6
@Override public void onComplete() {
if (progressDialog != null) {
progressDialog.cancel();
}
}
});
}
// 圖檔上繪制文字 加水印
private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop) {
Bitmap.Config bitmapConfig = bitmap.getConfig();
paint.setDither(true); // 擷取跟清晰的圖像采樣
paint.setFilterBitmap(true);// 過濾一些
if (bitmapConfig == null) {
bitmapConfig = Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
canvas.drawText(text, paddingLeft, paddingTop, paint);
return bitmap;
}
}
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hisense.ConstrantActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="show picture"
android:onClick="show"
/>
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>