lmw
2023-06-06 7a563b559c48b9b339784c25fc5f0adc2ab5154e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package cn.sinata.xldutils.activity
 
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
import android.os.Environment
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import cn.sinata.xldutils.R
import cn.sinata.xldutils.defaultScheduler
import cn.sinata.xldutils.ioScheduler
import cn.sinata.xldutils.utils.BitmapUtils
import cn.sinata.xldutils.utils.getSDFreeSize
import cn.sinata.xldutils.view.ClipImageBorderView
import cn.sinata.xldutils.view.ClipZoomImageView
import cn.sinata.xldutils.xldUtils
import io.reactivex.*
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import io.reactivex.subscribers.DisposableSubscriber
import org.jetbrains.anko.*
import org.reactivestreams.Subscription
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
 
class CropImageActivity : TitleActivity() {
 
    private val mZoomImageView by lazy {
        ClipZoomImageView(this)
    }
 
    var bitmap: Bitmap? = null
    var url: String? = null
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_crop_image)
        title = "裁剪图片"
        titleBar.addRightButton("确定", onClickListener = View.OnClickListener {
            if (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED) {
                toast("未检测到SD卡!请安装后重试!")
                return@OnClickListener
            }
            //如果sd卡剩余容量低于10m
            if (getSDFreeSize() < 10) {
                toast("SD卡剩余空间太小!")
                return@OnClickListener
            }
            showDialog("图片处理中...")
            url = xldUtils.PICDIR + System.currentTimeMillis() + ".jpg"
            Flowable.just(mZoomImageView.clip())
                    .subscribeOn(Schedulers.io())
                    .flatMap {
                        saveBitmapToSDCard(it)
                        Flowable.just(url)
                    }.observeOn(AndroidSchedulers.mainThread())
                    .subscribe(object : FlowableSubscriber<String>{
                        override fun onSubscribe(s: Subscription) {
                            s.request(1)
                        }
 
                        override fun onComplete() {
                        }
 
                        override fun onError(t: Throwable?) {
                            toast("处理出错!")
                            dismissDialog()
                        }
 
                        override fun onNext(t: String?) {
                            dismissDialog()
                            val intent = Intent()
                            intent.putExtra("path", url)
                            setResult(RESULT_OK, intent)
                            finish()
                        }
                    })
        })
        val rl_content = find<RelativeLayout>(R.id.rl_content)
        val mClipImageView = ClipImageBorderView(this)
        val scale = intent.getFloatExtra("scale", 1f)
        val mode = intent.getIntExtra("mode", 0)
        if (mode == 1) {
            mClipImageView.setMode(ClipImageBorderView.Mode.Circle)
        }
        val lp = ViewGroup.LayoutParams(matchParent, matchParent)
        rl_content.addView(mClipImageView, lp)
        rl_content.addView(mZoomImageView, 0, lp)
        val mHorizontalPadding = if (scale < 1f) {
            dip(5)
        } else {
            dip(10)
        }
        mZoomImageView.setHorizontalPadding(mHorizontalPadding)
        mClipImageView.setHorizontalPadding(mHorizontalPadding)
        mZoomImageView.setImageScale(scale)
        mClipImageView.setImageScale(scale)
        val uri = intent.getStringExtra("uri")
        if (uri != null) {
            showDialog("图片加载中...")
            Flowable.just("").ioScheduler().flatMap {
                bitmap = BitmapUtils.decodeBitmapFromPath(this, uri)
                Flowable.just(bitmap)
            }.defaultScheduler().subscribe(object : DisposableSubscriber<Bitmap>(){
                override fun onComplete() {
 
                }
 
                override fun onNext(t: Bitmap?) {
                    dismissDialog()
                    if (t == null) {
                        toast("无法打开图片,请检查是否开启读取权限!")
                    }
                    mZoomImageView.imageBitmap = t
                }
 
                override fun onError(t: Throwable?) {
                    dismissDialog()
                    toast("图片打开失败,请检查是否开启读取权限!")
                }
            })
        }
 
    }
 
    private fun saveBitmapToSDCard(bmp: Bitmap) {
 
        val path = xldUtils.PICDIR
        var file = File(path)
        if (!file.exists()) {
 
            file.mkdirs()
        }
        file = File(url)
        try {
            val out = FileOutputStream(file)
            if (bmp.compress(Bitmap.CompressFormat.JPEG, 100, out)) {
                out.flush()
                out.close()
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
 
    }
 
    override fun onDestroy() {
        super.onDestroy()
        if (bitmap != null) {
            bitmap?.recycle()
        }
    }
}