MainActivity.java
package com.bilibili.draweetext.demo
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.support.annotation.Nullable
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import android.support.v4.app.ListFragment
import android.support.v4.view.ViewPager
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.method.ScrollingMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView
import com.bilibili.draweetext.DraweeSpan
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ViewPager pager = findViewById(R.id.container)
pager.setAdapter(new SectionsAdapter(getSupportFragmentManager()))
}
private class SectionsAdapter extends FragmentPagerAdapter {
SectionsAdapter(FragmentManager fm) {
super(fm)
}
@Override
public int getCount() {
return 3
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Simple"
case 1:
return "ListView"
case 2:
return "RecyclerView"
default:
throw new IndexOutOfBoundsException()
}
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return SimpleFragment.newInstance()
case 1:
return ListViewFragment.newInstance()
case 2:
return RecyclerViewFragment.newInstance()
default:
throw new IndexOutOfBoundsException()
}
}
}
public static class SimpleFragment extends Fragment {
public static Fragment newInstance() {
return new SimpleFragment()
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_simple, container, false)
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState)
final TextView textview = view.findViewById(R.id.text1)
textview.setMovementMethod(ScrollingMovementMethod.getInstance())
textview.setText(buildText())
view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.getTag() == "") {
textview.setText(buildText())
v.setTag(null)
} else {
textview.setText(buildText2())
v.setTag("")
}
}
})
}
CharSequence buildText() {
SpannableStringBuilder builder = new SpannableStringBuilder()
builder.append("2333333333333")
builder.append("\nwh=50, margin=0:www")
int start = builder.length()
builder.append("[img]")
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/24fe1ed09fbc11e59d8700163e00043c")
.setLayout(50, 50).build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("www")
builder.append("\nwh=100, margin=8, align baseline:")
start = builder.length()
builder.append("[img]")
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/24fe1ed09fbc11e59d8700163e00043c", true)
.setLayout(100, 100)
.setMargin(8)
.build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("www")
builder.append("\nwh=100, margin=4, 4, 8,webp:")
start = builder.length()
builder.append("[img]")
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/[email protected]")
.setLayout(100, 100).setMargin(4, 4, 8).build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("www")
builder.append("\nwh=150, margin=0:www")
start = builder.length()
builder.append("[img]")
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/250c9dc09fbc11e59d8700163e00043c")
.setLayout(150, 150).build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("www")
builder.append("\n\n")
start = builder.length()
builder.append("[emotion:tv_cheers]")
DraweeSpan span = new DraweeSpan.Builder("http://static.yo9.com/web/emotions/tv_cheers.png").build()
builder.setSpan(span, start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("bilibili- ( ゜- ゜)つロ 乾杯~\n")
builder.append("why I so diao")
start = builder.length()
builder.append("[img]")
Drawable placeHolder = new ColorDrawable(Color.RED)
span = new DraweeSpan.Builder("http://img.yo9.com/c82aa6c003d311e6ac3c00163e000cde@320w_720h.jpg")
.setLayout(360, 720)
.setPlaceHolderImage(placeHolder)
.build()
builder.setSpan(span, start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("sad sad")
start = builder.length()
builder.append("[emotion:tv_sad]")
placeHolder = getResources().getDrawable(R.mipmap.ic_launcher)
span = new DraweeSpan.Builder("http://static.yo9.com/web/emotions/tv_sad.png")
.setLayout(150, 150)
.setPlaceHolderImage(placeHolder)
.build()
builder.setSpan(span, start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("\n\n")
builder.append("This is a gif, margin=10:")
start = builder.length()
builder.append("[gif:d559f520246811e69a4a00163e000cdb]")
placeHolder = new ColorDrawable(Color.BLUE)
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/d559f520246811e69a4a00163e000cdb")
.setPlaceHolderImage(placeHolder)
.setLayout(200, 197)
.setMargin(10)
.setShowAnimaImmediately(true)
.build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("\nDisabled animation")
start = builder.length()
builder.append("[gif:d559f520246811e69a4a00163e000cdb]")
placeHolder = new ColorDrawable(Color.BLUE)
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/d559f520246811e69a4a00163e000cdb")
.setPlaceHolderImage(placeHolder)
.setLayout(200, 197)
.setShowAnimaImmediately(false)
.build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
return builder
}
CharSequence buildText2() {
SpannableStringBuilder builder = new SpannableStringBuilder()
builder.append("Reset text in same DraweeTextView~~~~")
int start = builder.length()
builder.append("[img]")
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/24fe1ed09fbc11e59d8700163e00043c")
.setLayout(50, 50).build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("\n\n")
builder.append("This is a gif, margin=10:")
start = builder.length()
builder.append("[gif:d559f520246811e69a4a00163e000cdb]")
Drawable placeHolder = new ColorDrawable(Color.BLUE)
builder.setSpan(new DraweeSpan.Builder("http://img.yo9.com/d559f520246811e69a4a00163e000cdb")
.setPlaceHolderImage(placeHolder)
.setLayout(200, 197)
.setMargin(10)
.setShowAnimaImmediately(true)
.build(),
start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("\n\n")
start = builder.length()
builder.append("[emotion:tv_cheers]")
builder.setSpan(new DraweeSpan.Builder("http://static.yo9.com/web/emotions/tv_cheers.png").build()
, start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("bilibili- ( ゜- ゜)つロ 乾杯~\n")
return builder
}
}
static String[] EMOTIONS = new String[]{
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/6f058f78bce5d1c9b370c3807c891e685bb68a17.png",
"http://i0.hdslb.com/bfs/vip/7f482b82a3de44ae14537cbafcbc40cf65f7113e.png",
"http://i0.hdslb.com/bfs/vip/458982f20f0b7dc68c0ddac89f51ecb7c3d16a83.png",
"http://i0.hdslb.com/bfs/vip/6846363907204271f0a57472744642c8882b4019.png",
"http://i0.hdslb.com/bfs/vip/de3aee88f7b6cc20ba9480c96c02f83a844381a9.png",
"http://i0.hdslb.com/bfs/vip/7a4cb0b644214d476ce198ddf6a7a0aa31311199.png",
"http://i0.hdslb.com/bfs/vip/[email protected]",
"http://i0.hdslb.com/bfs/vip/77545a5e420e2c43e0e4a7996a71769638ae3f90.png",
"http://i0.hdslb.com/bfs/vip/af8f017e383a1999e26a7f91c3ec3c83fbb7ba77.png",
"http://static.yo9.com/web/static/emotions/tv_cheers.png",
"http://static.yo9.com/web/static/emotions/tv_huaji.png",
"http://static.yo9.com/web/static/emotions/tv_mygod.png",
"http://static.yo9.com/web/static/emotions/tv_angry.png",
"http://static.yo9.com/web/static/emotions/tv_thinking.png",
"http://static.yo9.com/web/static/emotions/tv_zhuangb.png",
"http://static.yo9.com/web/static/emotions/tv_shocking.png",
"http://static.yo9.com/web/static/emotions/tv_pill.png",
"http://static.yo9.com/web/static/emotions/tv_kira.png",
"http://static.yo9.com/web/static/emotions/tv_ji.png",
}
public static class ListViewFragment extends ListFragment {
public static Fragment newInstance() {
return new ListViewFragment()
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setListAdapter(new ArrayAdapter<>(getContext(), R.layout.simple_text,
buildArray()))
}
private CharSequence[] buildArray() {
CharSequence[] sequences = new CharSequence[EMOTIONS.length * 2]
for (int i = 0
SpannableStringBuilder builder = new SpannableStringBuilder()
String emotion = EMOTIONS[i % EMOTIONS.length]
builder.append(emotion).append('\n')
int start = builder.length()
builder.append("[emotion]")
builder.setSpan(new DraweeSpan.Builder(emotion).setLayout(140, 140).build(), start, builder.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("~~~~~~~~~~~~~~~~~~")
sequences[i] = builder
}
return sequences
}
}
public static class RecyclerViewFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_recycler, container, false)
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState)
RecyclerView recyclerView = view.findViewById(R.id.recycler)
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2))
recyclerView.setHasFixedSize(true)
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.inset(8, 8)
}
})
final CharSequence[] sequences = new CharSequence[EMOTIONS.length * 2]
for (int i = 0
SpannableStringBuilder builder = new SpannableStringBuilder()
String emotion = EMOTIONS[i % EMOTIONS.length]
builder.append(String.valueOf(i)).append("~~~").append('\n')
int start = builder.length()
builder.append("[emotion]")
builder.setSpan(new DraweeSpan.Builder(emotion).setLayout(120, 120).build(), start, builder.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.append("\n~~~~~")
sequences[i] = builder
}
recyclerView.setAdapter(new RecyclerView.Adapter<TextViewHolder>() {
@Override
public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new TextViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.simple_text, parent, false))
}
@Override
public void onBindViewHolder(TextViewHolder holder, int position) {
holder.text.setText(sequences[position])
}
@Override
public int getItemCount() {
return sequences.length
}
})
}
static class TextViewHolder extends RecyclerView.ViewHolder {
TextView text
TextViewHolder(View itemView) {
super(itemView)
text = (TextView) itemView
}
}
public static Fragment newInstance() {
return new RecyclerViewFragment()
}
}
}
MainApplication.java
package com.bilibili.draweetext.demo;
import android.app.Application;
import android.util.Log;
import com.facebook.common.logging.FLog;
import com.facebook.common.logging.FLogDefaultLoggingDelegate;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
/**
* @author yrom.
*/
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this, ImagePipelineConfig.newBuilder(this)
.experiment()
.setWebpSupportEnabled(true)
.build());
if (BuildConfig.DEBUG) {
FLogDefaultLoggingDelegate.getInstance().setApplicationTag("Drawee-text");
FLog.setMinimumLoggingLevel(Log.VERBOSE);
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.PagerTitleStrip
android:id="@+id/tab"
android:background="#ccc"
android:padding="4dp"
android:textColor="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="36dp">
</android.support.v4.view.PagerTitleStrip>
</android.support.v4.view.ViewPager>
</FrameLayout>
fragment_recycler.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
fragment_simple.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.bilibili.draweetext.DraweeTextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reset text!"/>
</RelativeLayout>
simple_text.xml
<?xml version="1.0" encoding="utf-8"?>
<com.bilibili.draweetext.DraweeTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:padding="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />