Android,实现一个弹幕效果的小demo
2017-09-26 11:47
711 查看
代码不是很多,花了十多分钟写的。。。
BarrageLauncher(弹幕发射器)
NativeVideoPlayer(视频播放器)
package com.zzyd.example; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.TextView; import java.util.Random; /** * Created by Administrator on 2017/9/26 0026. * 弹幕发射器 */ public class BarrageLauncher extends FrameLayout implements View.OnClickListener { private Context context; private NativeVideoPlayer nativeVideoPlayer; private View barrageView; private EditText editText; private Button sendBtn; private TranslateAnimation animation; private int viewWidth; private int viewHeight; public BarrageLauncher(@NonNull Context context) { super(context); this.context = context; init(); } public BarrageLauncher(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.context = context; init(); } private void init() { nativeVideoPlayer = new NativeVideoPlayer(context); barrageView = View.inflate(context, R.layout.view_barrage, null); editText = barrageView.findViewById(R.id.barrageEd); sendBtn = barrageView.findViewById(R.id.sendBtn); sendBtn.setOnClickListener(this); addView(nativeVideoPlayer); addView(barrageView); Resources resources = getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); } public void loadBarrage(final String[] barrages){ new Thread(new Runnable() { @Override public void run() { for(String s : barrages){ Message msg = Message.obtain(); msg.what = 0; Bundle b = new Bundle(); b.putString("key",s); msg.setData(b); handler.sendMessage(msg); try { Thread.sleep(80); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); viewWidth = MeasureSpec.getSize(widthMeasureSpec); viewHeight = MeasureSpec.getSize(heightMeasureSpec); animation = new TranslateAnimation(viewWidth,0,50,50); animation.setDuration(8500); animation.setInterpolator(new LinearInterpolator()); } public void addItemView(final View child){ super.addView(child); FrameLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); // layoutParams.gravity = Gravity.RIGHT; layoutParams.topMargin = getRandom(10,viewHeight/2); child.setLayoutParams(layoutParams); child.startAnimation(animation); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { removeView(child); } @Override public void onAnimationRepeat(Animation animation) { } }); } private TextView createItemView(String msg){ TextView textView = new TextView(context); textView.setText(msg); textView.setTextColor(Color.YELLOW); textView.setTextSize(getRandom(15,25)); return textView; } @Override public void onClick(View view) { addItemView(createItemView(editText.getText().toString())); editText.setText(""); } private static int getRandom(int min , int max){ Random random = new Random(); return random.nextInt(max)%(max - min + 1) + min; } private Handler handler = new Handler(){ @Override public void dispatchMessage(Message msg) { super.dispatchMessage(msg); addItemView(createItemView(msg.getData().getString("key"))); } }; }
package com.zzyd.example; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.MediaPlayer; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; /** * Created by Administrator on 2017/9/26 0026. */ public class NativeVideoPlayer extends SurfaceView { private SurfaceHolder surfaceHolder; private MediaPlayer mediaPlayer; private Context context; public NativeVideoPlayer(Context context) { super(context); this.context = context; init(); } public NativeVideoPlayer(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } private void init(){ surfaceHolder = getHolder(); surfaceHolder.addCallback(callback2); mediaPlayer = new MediaPlayer(); } private SurfaceHolder.Callback2 callback2 = new SurfaceHolder.Callback2() { @Override public void surfaceRedrawNeeded(SurfaceHolder surfaceHolder) { } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { mediaPlayer.setSurface(surfaceHolder.getSurface()); try { AssetManager assetMg = context.getAssets(); AssetFileDescriptor fileDescriptor = assetMg.openFd("test.mp4"); mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength()); mediaPlayer.setLooping(true); mediaPlayer.setVolume(0, 0); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { mediaPlayer.stop(); mediaPlayer.release(); } }; }
package com.zzyd.example; import android.content.pm.ActivityInfo; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private String[] barrages = new String[]{ "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", "onCreate","AppCompatActivity", "MainActivity", "String[]", "barrages","String", "mipmap-hdpi", "activity_main.xml", "barrageLauncher", "ic_launcher_round.png", "AndroidManifest.xml", "mipmap-xxhdpi", "BarrageLauncher", "SCREEN_ORIENTATION_LANDSCAPE", "barrageLauncher", "BarrageLauncher", "ActivityInfo", "setRequestedOrientation", "onCreate", "savedInstanceState", }; BarrageLauncher barrageLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); barrageLauncher = new BarrageLauncher(this); setContentView(barrageLauncher); barrageLauncher.postDelayed(new Runnable() { @Override public void run() { Message message = Message.obtain(); message.what = 0; handler.sendMessage(message); } },1000); } private Handler handler = new Handler(){ @Override public void dispatchMessage(Message msg) { super.dispatchMessage(msg); Toast.makeText(MainActivity.this,"发射",Toast.LENGTH_SHORT).show(); barrageLauncher.loadBarrage(barrages); } }; }
相关文章推荐
- Android下 一个自定义VIEW实现简单的弹幕效果
- Android编程实现简易弹幕效果示例【附demo源码下载】
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- Android学习小Demo(6)图片折叠效果的实现
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- Android自定义控件继承ViewGrop实现一个GridView的显示效果
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- Android中用图片自定义一个进度条(实现蒙板效果)
- [android] 实现一个按钮点击效果
- Android学习小Demo(15)一个自定义AlertDialog的实现
- 从零开始打造一个新闻订阅APP之Android篇(一、实现仿微信主界面效果)
- Android ImageButton 如何实现一个点击效果
- Android上一个动画效果的实现与优化
- Android中用图片自定义一个进度条(实现蒙板效果)
- 自己实现的一个Android上面TreeView效果
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- 一个css效果的Android实现
- 一个简单的实现tab效果的demo
- 分享一个Android左右侧滑的效果实现 sliding layout
- android一个布局由消失变为可见时实现动画效果