안 드 로 이 드 시 나 웨 이 보,QQ 공간 등 게시 물 표시(2)

소개

이것 은 시 나 웨 이 보 의 한 게시 물 로 화제,표정,@친구 세 가지 디 스 플레이 를 포함한다.디 스 플레이 방법 은 전편 에서 설명 한 바 와 같이 SpannableString 을 사용 합 니 다.이 글 은 주로 이 게시 물 을 보 여 주 는 해석 도구 류 를 소개 한다.
실현
1.문자열 표시 와 대응 정규 표현 식
화 제 를 괄호 로 묶다
표정
친구
정규 매 칭 을 통 해 댓 글 정 보 를 분석 하 다.
화제->\#[^\#]+\#
표정->[^]+]
@친구->친구 닉네임
2.일반적인 방법 을 써 서 spanableString 에 대해 정규 판단 을 하고 요구 에 부합 되면 내용 을 변색 시킨다.

private static void dealPattern(int color, SpannableString spannableString, Pattern patten, int start) throws Exception {
  Matcher matcher = patten.matcher(spannableString);
  while (matcher.find()) {
   String key = matcher.group();
   //                       ,ture      
   if (matcher.start() < start) {
    continue;
   }
   //         ,             
   int end = matcher.start() + key.length();
   //     span
   spannableString.setSpan(new ForegroundColorSpan(color), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
   if (end < spannableString.length()) {
    //             ,   。。
    dealPattern(color, spannableString, patten, end);
   }
   break;
  }
 }

3.누 를 수 있 는 것 이 있어 야 하기 때문에 누 를 수 있 는 내용 을 처리 하 는 방법 이 필요 합 니 다.
① 인 터 페 이 스 를 먼저 정의 하고 인 터 페 이 스 를 통 해 클릭 이 벤트 를 호출 자 에 게 전달

 public interface SpanClickListener<T>{
  void onSpanClick(T t);
 }
② 일반적인 방법 을 써 서 spanableString 을 정규 적 으로 판단 하고 요구 에 부합 되면 내용 설정 을 클릭 할 수 있 습 니 다.

private static void dealClick(SpannableString spannableString, Pattern patten, int start, final SpanClickListener spanClickListener, final Object bean){
  Matcher matcher = patten.matcher(spannableString);
  while (matcher.find()) {
   String key = matcher.group();
   //                       ,ture      
   if (matcher.start() < start) {
    continue;
   }
   //         ,             
   int end = matcher.start() + key.length();
   spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
     spanClickListener.onSpanClick(bean);
    }
    @Override
    public void updateDrawState(TextPaint ds) {
     super.updateDrawState(ds);
     //      
     ds.setUnderlineText(false);//      
    }
   }, matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
   if (end < spannableString.length()) {
    //             ,   。。
    dealClick(spannableString, patten, end, spanClickListener, bean);
   }
   break;
  }
 }

4.표정 해석 법

private void dealExpression(Context context,
   SpannableString spannableString, Pattern patten, int start)
   throws Exception {
  Matcher matcher = patten.matcher(spannableString);
  while (matcher.find()) {

   String key = matcher.group();
   if (matcher.start() < start) {
    continue;
   }
   String value = emojiMap.get(key);
   if (TextUtils.isEmpty(value)) {
    continue;
   }
   //                    id
   int resId = context.getResources().getIdentifier(value, "drawable",
     context.getPackageName());
   if (resId != 0) {
    Drawable emoji = context.getResources().getDrawable(resId);
    int w = (int) (emoji.getIntrinsicWidth() * 0.40);
    int h = (int) (emoji.getIntrinsicHeight() * 0.40);
    emoji.setBounds(0, 0, w, h);
    //       id   bitmap,   ImageSpan   
    ImageSpan imageSpan = new ImageSpan(emoji);
    //           ,             
    int end = matcher.start() + key.length();
    //                 
    spannableString.setSpan(imageSpan, matcher.start(), end,
      Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    if (end < spannableString.length()) {
     dealExpression(context, spannableString, patten, end);
    }
    break;
   }
  }
 }

5.키워드 변색 처리 방법,이 실제 사용 장면,예 를 들 어 지도 키워드 검색,키워드 주소 에 일치 하 는 키워드 표시 특별 색상

public static SpannableString getKeyWordSpan(int color, String str, String patterStr) throws Exception {
  SpannableString spannableString = new SpannableString(str);
  Pattern patten = Pattern.compile(patterStr, Pattern.CASE_INSENSITIVE);
  dealPattern(color, spannableString, patten, 0);
  return spannableString;
 }
6.화제 처리,매개 변수 에 화제 대상 이 들 어 와 야 합 니 다.여기 댓 글 중 에 하나 밖 에 없 는 상황 만 처 리 했 어 요.

 public static SpannableString getTopicSpan(int color, String str, boolean clickable,SpanClickListener spanClickListener, Topic topic) throws Exception {
  SpannableString spannableString = new SpannableString(str);
  Pattern patten = Pattern.compile(PatternString.TOPIC_PATTERN, Pattern.CASE_INSENSITIVE);
  if(clickable){
   dealClick(spannableString, patten, 0, spanClickListener, topic);
  }
  dealPattern(color, spannableString, patten, 0);
  return spannableString;
 }

7.@친구 처리,매개 변수 에@친구 목록 을 입력 해 야 합 니 다.

public static SpannableString getAtUserSpan(int color, String str, boolean clickable, SpanClickListener spanClickListener, List<User> atUsers) throws Exception {
  SpannableString spannableString = new SpannableString(str);
  Pattern patten;
  for (User u : atUsers) {
   patten = Pattern.compile("@" + u.getName(), Pattern.CASE_INSENSITIVE);
   if(clickable){
    dealClick(spannableString, patten, 0, spanClickListener, u);
   }
   dealPattern(color, spannableString, patten, 0);
  }
  return spannableString;
 }

8.표정 처리 가 깔끔 하 다

 public static SpannableString getExpressionSpan(Context context, String str) throws Exception {
  return ExpressionConvertUtil.getInstace().getExpressionString(context, str);
 }

사용
1.키워드 변색

private void testColoredKeywd() {
  String string = "Android      “   ”,    Google 2007 11 5 ,Android logo    ,Android logo    (36 )
"; SpannableString cardText = null; try { cardText = SpanUtils.getKeyWordSpan(getResources().getColor(R.color.md_green_600), string, "Android"); } catch (Exception e) { e.printStackTrace(); } tvColoredKeywd.setText(cardText); }
2.화제 테스트,주의해 야 할 것 은 일부 내용 을 클릭 할 수 있 도록 tvTopic.setMovement Method(LinkMovement Method.getInstance()를 설정 해 야 합 니 다.그렇지 않 으 면 클릭 하면 효과 가 없습니다.

private void testTopic() {
  String topic = "#      #                     ~L    
"; SpannableString topicText = null; try { topicText = SpanUtils.getTopicSpan(Color.BLUE, topic, true, new SpanUtils.SpanClickListener<Topic>() { @Override public void onSpanClick(Topic t) { Toast.makeText(MainActivity.this, " :" + t.toString() , Toast.LENGTH_SHORT).show(); } }, new Topic(1, " ")); } catch (Exception e) { e.printStackTrace(); } tvTopic.setText(topicText); // , tvTopic.setMovementMethod(LinkMovementMethod.getInstance()); }
3.친구 테스트

private void textAtUsers(){
  List<User> users = new ArrayList<>();
  users.add(new User(1, "  1"));
  users.add(new User(2, "  2"));
  StringBuilder sb = new StringBuilder("     ");
  for (User u : users) {
   sb.append("@").append(u.getName());
  }
  sb.append("
"); try { SpannableString atSpan = SpanUtils.getAtUserSpan(Color.BLUE, sb.toString(), true, new SpanUtils.SpanClickListener<User>() { @Override public void onSpanClick(User user) { Toast.makeText(MainActivity.this, "@ :" + user.toString(), Toast.LENGTH_SHORT).show(); } }, users); tvTestAt.setText(atSpan); tvTestAt.setMovementMethod(LinkMovementMethod.getInstance()); } catch (Exception e) { e.printStackTrace(); } }
4.표정 테스트

 private void textExpression(){
  String exStr = "       [  ],         [ ]";
  SpannableString span = null;
  try {
   span = SpanUtils.getExpressionSpan(this, exStr);
  } catch (Exception e) {
   e.printStackTrace();
  }
  tvExpression.setText(span);
 }

효과 도

다운로드:https://github.com/LineChen/SpannableStringDemo
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기