SVG(可缩放矢量图形)
????????可缩放矢量图形(Scalable Vector Graphics,SVG)是W3C推出的基于XML的二维矢量图形标准。
与HTML相类似,基于XML的SVG,语法和格式也是结构化的。所谓结构化,也就是文件中的对象通过特定的无素标签定义,任何无素都可以作为对象进行管理,文件是框架式的。掌握基本的文件框架,就可以阅读、编辑和创作自己的文件。
SVG使用一组组的元素标签,创建和组织文件以及文件中的对象。每一个SVG文件都包含最外层的<SVg></SVg>标签。该标签用于声明SVG文件的开始和结束。这等同于HTML文件中的HTML文件声明标签<Html></html>。
SVG主体中的语法和格式定义遵循XML标准,通过各类元素标签和标签对应的属性来描述SVG对象。
SVG对象主要包括图形,路径和文本。
可以将SVG文件嵌入到XML网页或HTML网页执行。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:gravity="center_horizontal"
android:orientation="vertical">
<WebView
android:id="@+id/mWebView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
不用过多解释了吧,布局里面就一个WebView,接下来我们来看下主界面代码?:
package com.example.test.svg
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.test.R
import kotlinx.android.synthetic.main.activity_svg.*
import java.io.*
class SvgActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_svg)
val inputStream: InputStream = read_user("/sdcard/svg/icon_svg_gaojin.svg")
//8.这个流是字节流,需要我们转换为字符流才可以认识
val info: String = getTextFromStream(inputStream).toString()
mWebView.loadData(info, "text/html", "UTF-8")
}
@Throws(Exception::class)
fun read_user(filename: String?): InputStream {
val file = File(filename)
val inStream = FileInputStream(file)
val buffer = ByteArray(1024)
var len = 0
val outStream = ByteArrayOutputStream()
while (inStream.read(buffer).also { len = it } != -1) {
outStream.write(buffer, 0, len)
}
val data: ByteArray = outStream.toByteArray() //得到文件的二进制数据
val `is`: InputStream = ByteArrayInputStream(data)
outStream.close()
inStream.close()
return `is`
}
//字节流转成字符流
fun getTextFromStream(inputStream: InputStream): String? {
val b = ByteArray(1024)
var len: Int
val bos = ByteArrayOutputStream()
try {
while (inputStream.read(b).also { len = it } != -1) {
bos.write(b, 0, len)
}
//把流中的数据转成字节数组的形式,然后用字节数组构造一个字符串
val bytes = bos.toByteArray()
bos.close()
return String(bytes)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
return null
}
}
?我们先把svg图片当文字内容读出来,再转化为String的字符流传给WebView即可
|