Android 탄막 프레임 어둠 의 화염 기본 사용 방법

11308 단어 android탄막프레임
오늘 은 빌 리 빌 리 가 시작 한 안 드 로 이 드 팝 업 프레임 워 크(DanmakuFlameMaster)의 학습 경험 을 공유 하 겠 습 니 다.
저 는 전체 프레임 워 크 를 model 형식 으로 프로젝트 에 도입 하여 소스 코드 를 더욱 편리 하 게 관찰 합 니 다.의존 적 으로 주입 할 수도 있어 요.

dependencies { 
compile 'com.github.ctiao:DanmakuFlameMaster:0.5.3' 
}
내 가 만 들 효과 도 를 먼저 놓 아 라.

페이지 분석
위의 그림 을 보면 전체 UI 가 3 층 으로 나 뉘 어 져 있다.맨 아래 는 영상 층 이 고 중간 은 탄막 층 이 며 꼭대기 층 은 제어 층 이다.현재 시장 에서 주류 인 영상 생방송 소프트웨어 는 대부분이 이렇게 층 을 나 누 는데 생방송 류 가 다 르 면 상호작용 층 이 더 많아 져 출석 정보,선물 정보 등 을 표시 할 수 있다.
레이 어 링 이 라면 FrameLayout 프레임 레이아웃 으로 바로 이 루어 졌 습 니 다.내 레이아웃 파일 붙 여 넣 기:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<VideoView 
android:id="@+id/vv_video" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 
<master.flame.danmaku.ui.widget.DanmakuView 
android:id="@+id/sv_danmaku" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 
<include android:id="@+id/media_controller" 
android:layout_width="match_parent" 
android:layout_height="fill_parent" 
layout="@layout/media_controller" /> 
</FrameLayout>
제어 층 의 레이아웃:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 
<LinearLayout 
android:gravity="center_vertical" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_gravity="bottom" 
android:background="#8acc22dd" > 
<Button 
android:layout_weight="1" 
android:id="@+id/rotate" 
android:layout_width="0dp" 
android:layout_height="wrap_content" 
android:text="@string/rotate" /> 
<Button 
android:layout_width="0dp" 
android:layout_weight="1" 
android:id="@+id/btn_hide" 
android:layout_height="wrap_content" 
android:text="@string/hide_danmaku" /> 
<Button 
android:id="@+id/btn_show" 
android:layout_width="0dp" 
android:layout_weight="1" 
android:layout_height="wrap_content" 
android:text="@string/show_danmaku" /> 
<Button 
android:id="@+id/btn_pause" 
android:layout_width="0dp" 
android:layout_weight="1" 
android:layout_height="wrap_content" 
android:text="@string/pause_danmaku" /> 
<Button 
android:id="@+id/btn_resume" 
android:layout_width="0dp" 
android:layout_weight="1" 
android:layout_height="wrap_content" 
android:text="@string/resume_danmaku" /> 
<Button 
android:id="@+id/btn_send" 
android:layout_width="0dp" 
android:layout_weight="1" 
android:layout_height="wrap_content" 
android:text="@string/send_danmaku" /> 
<Button 
android:id="@+id/btn_send_image_text" 
android:layout_width="0dp" 
android:layout_weight="1" 
android:layout_height="wrap_content" 
android:text="@string/send_danmaku_image_text" /> 
<Button 
android:id="@+id/btn_send_danmakus" 
android:layout_width="0dp" 
android:layout_weight="1" 
android:layout_height="wrap_content" 
android:text="@string/send_danmakus" /> 
</LinearLayout> 
</FrameLayout>
레이아웃 을 쓰 고 초기 화 하 는 방법 을 먼저 쓰 십시오.

//       
HashMap<Integer,Integer> maxLinesPair = new HashMap<>(); 
maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL,5);//        5  
//         
HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<>(); 
overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true); 
overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true); 
mDanmakuContext = DanmakuContext.create();//       
mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN,3);//       
mDanmakuContext.setDuplicateMergingEnabled(false);//           
mDanmakuContext.setScrollSpeedFactor(1.2f);//         
mDanmakuContext.setScaleTextSize(1.2f);//         
mDanmakuContext.setCacheStuffer(new SpannedCacheStuffer(),mCacheStufferAdapter);//                SpannedCacheStuffer 
mDanmakuContext.setMaximumLines(maxLinesPair);//       
mDanmakuContext.preventOverlapping(overlappingEnablePair); //         
mParser = createParser(this.getResources().openRawResource(R.raw.comments));//         
mDvDanmaku.prepare(mParser, mDanmakuContext); 
mDvDanmaku.showFPS(true); 
mDvDanmaku.enableDanmakuDrawingCache(true);
그리 기 충전 기 를 다시 붙 여 넣 으 면 그림 과 문 자 를 함께 배열 하 는 효과 가 있 습 니 다.

private SpannableStringBuilder createSpannable(Drawable drawable) { 
String text = "bitmap"; 
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text); 
ImageSpan span = new ImageSpan(drawable); 
spannableStringBuilder.setSpan(span, 0, text.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
spannableStringBuilder.append("    "); 
spannableStringBuilder.setSpan(new BackgroundColorSpan(Color.parseColor("#8A2233B1")), 0, spannableStringBuilder.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
return spannableStringBuilder; 
}
BaseDanmaku 와 같은 종류 에서 탄막 의 기본 운동 형식 을 정의 했다:TYPESCROLL_RL、TYPE_SCROLL_LR、TYPE_FIX_TOP、TYPE_FIX_BOTTOM 과 TYPESPECIAL。즉,오른쪽 에서 왼쪽으로,왼쪽 에서 오른쪽으로(역방향 탄막),상단 탄막,밑부분 탄막 과 고급 탄막 이다.스 크 립 트 탄막
초기 화 할 때 특유 의 탄막 컨 텍스트 인 DanmukuContext 를 입력 하고 컨 텍스트 를 통 해 일부 설정 을 초기 화 해 야 합 니 다.탄막 자원 은 xml 파일 에 저 장 됩 니 다.대체적으로 다음 과 같 습 니 다.
.

<i> 
<chatserver>chat.bilibili.com</chatserver> 
<chatid>2962351</chatid> 
<mission>0</mission> 
<maxlimit>1500</maxlimit> 
<source>k-v</source> 
<d p="145.91299438477,1,25,16777215,1422201001,0,D6673695,757075520">             </d> 
</i>
헤드 정 보 는 많은 관심 을 가 질 필요 가 없습니다.d 태그 에서 p 에 대응 하 는 매개 변수의 구체 적 인 의 미 를 보십시오.
첫 번 째:탄막 출현 시간
두 번 째:탄막 유형(1.오른쪽 에서 왼쪽으로;6.왼쪽 에서 오른쪽으로;5.상단 탄막;4.바닥 탄막;7.고급 탄막;8.스 크 립 트 탄막')
번호
색상
타임 스탬프
여섯 번 째:스크린 샷 ID
일곱 번 째:사용자 hash 값
여덟 번 째:탄막 id
다음은 탄막 구체 적 해석 코드 입 니 다.

/** 
*            
* @param stream 
* @return 
*/ 
private BaseDanmakuParser createParser(InputStream stream) { 
if (stream == null) { 
return new BaseDanmakuParser() { 
@Override 
protected Danmakus parse() { 
return new Danmakus(); 
} 
}; 
} 
ILoader loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI);//    BiliDanmakuLoader           
try { 
loader.load(stream); 
} catch (IllegalDataException e) { 
e.printStackTrace(); 
} 
BaseDanmakuParser parser = new BiliDanmukuParser();//      
IDataSource<?> dataSource = loader.getDataSource(); 
parser.load(dataSource); 
return parser; 
}
구체 적 인 해석 방안:

String tagName = localName.length() != 0 ? localName : qName; 
tagName = tagName.toLowerCase(Locale.getDefault()).trim(); 
if (tagName.equals("d")) { 
String pValue = attributes.getValue("p"); 
// parse p value to danmaku 
String[] values = pValue.split(","); 
if (values.length > 0) { 
long time = (long) (Float.parseFloat(values[0]) * 1000); //      
int type = Integer.parseInt(values[1]); //      
float textSize = Float.parseFloat(values[2]); //      
int color = Integer.parseInt(values[3]) | 0xFF000000; //    
item = mContext.mDanmakuFactory.createDanmaku(type, mContext); 
if (item != null) { 
item.setTime(time); 
item.textSize = textSize * (mDispDensity - 0.6f); 
item.textColor = color; 
item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK; 
} 
} 
}
탄막 자원 로드 가 완료 되면 mDvDanmuku 의 prepare()방법 을 사용 하여 준 비 를 수행 합 니 다.준비 가 완료 되면 DrawHandler.CallBack()리 셋 의 prepared 방법 을 호출 합 니 다.그리고 이 prepared 방법 에서 본 격 적 으로 탄막 을 작 동 시 킵 니 다.호출 순 서 는 다음 과 같 습 니 다.

mDvDanmaku.prepare(mParser, mDanmakuContext);//             
그리고 Danmuku View 의 prepare()방법 을 실행 합 니 다.

private void prepare() { 
if (handler == null) 
handler = new DrawHandler(getLooper(mDrawingThreadType), this, mDanmakuVisible);//    Handler 
}
이 Handler 를 통 해 프로 세 스 간 통신 을 실현 합 니 다.
handler.setConfig(config);
handler.setParser(parser);
handler.setCallback(mCallback);
handler.prepare();-》handler 에 게 메 시 지 를 보 내 서 진짜 준 비 를 하도록 하 겠 습 니 다.
Draw Handler 중 에 반전 이 있어 요.

public interface Callback { 
public void prepared(); 
public void updateTimer(DanmakuTimer timer); 
public void danmakuShown(BaseDanmaku danmaku); 
public void drawingFinished(); 
}
진정한 준비

mTimeBase = SystemClock.uptimeMillis(); 
if (mParser == null || !mDanmakuView.isViewReady()) {//     ,  0.1      
sendEmptyMessageDelayed(PREPARE, 100); 
} else { 
prepare(new Runnable() { 
@Override 
public void run() { 
pausedPosition = 0; 
mReady = true; 
if (mCallback != null) { 
mCallback.prepared(); 
} 
} 
}); 
}
이상 은 탄막 View 의 시작 호출 프로 세 스 입 니 다.
그럼 탄막 주 무 르 기 는 어떻게 추가 하나 요?원 방 씨,어떻게 생각 하 세 요?TM 내 가 어떻게 알 아?내 가 어떻게 봐?)아래 봐 봐.

private void addDanmaku(boolean islive) { 
BaseDanmaku danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);//              
if (danmaku == null || mDvDanmaku == null) { 
return; 
} 
danmaku.text = "      " + System.nanoTime(); 
danmaku.padding = 5; 
danmaku.priority = 0; //                     1  ,                  
danmaku.isLive = islive; 
danmaku.setTime(mDvDanmaku.getCurrentTime() + 1200); 
danmaku.textSize = 25f * (mParser.getDisplayer().getDensity() - 0.6f); 
danmaku.textColor = Color.RED;//          
danmaku.textShadowColor = Color.WHITE; 
danmaku.borderColor = Color.GREEN;//               ,             
mDvDanmaku.addDanmaku(danmaku); 
}
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 탄막 프레임 의 어두 운 불꽃 으로 여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기