文档章节

实现日语翻译酱(2)

Maxium_R
 Maxium_R
发布于 2015/10/16 10:46
字数 737
阅读 24
收藏 0

接上一篇博客,先上效果图

输入图片说明。 点击listview的item时弹出PopupWindow

我们先看PopupWindow的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:wheel="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    android:background="@android:color/background_light">



    <TextView
        android:id="@+id/text1"
        tools:text="789456"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:maxLines="3"
        android:textAppearance="@android:style/TextAppearance.Holo.Large" />

    <TextView
        android:id="@+id/text2"
        tools:text="789456"
        android:maxLines="3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="@android:style/TextAppearance.Holo"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        >


        <ImageView
            android:layout_weight="1"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:src="@android:drawable/ic_menu_share"/>
        <ImageView
            android:layout_weight="1"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:src="@android:drawable/ic_menu_camera"/>
        <!--FrameLayout-->
        <FrameLayout 
            android:layout_weight="1"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:onClick="mc_play">
            <demo.gojapn.translationdemo.common.view.ProgressWheel
                android:id="@+id/progress_wheel"
                android:layout_width="80dp"
                android:layout_height="80dp"
                wheel:matProg_barColor="@color/colorAccent"
                wheel:matProg_fillRadius="false"
                wheel:matProg_linearProgress="false"
                wheel:matProg_barWidth="3dp"
                wheel:matProg_rimColor="#ededed"
                />
            <ImageView
                android:id="@+id/progress_wheel_src_in"
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:src="@android:drawable/ic_media_play"
                android:scaleType="center"/>
        </FrameLayout>
    </LinearLayout>
</LinearLayout>

其中ProgressWheel项目可以查看这里>materialish-progress。 由于需要类似按钮效果,隐私折中的方法是使用Framelayout来实现按钮效果。同时初始化PopupWindow如下:

 private void initPop(){
       pop = new PopupWindow(this);
        pop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        pop.setHeight(dip2px(this, 250));
        pop.setBackgroundDrawable(new BitmapDrawable());
        pop.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                if (service!= null){
                    service.stop();
                }
            }
        });
    }

其中service为我们播放音频的逻辑业务类。实现如下:

public class MediaPlayerService {

    private MediaPlayer player;

    private ProgressWheel wheel;
    private ImageView imgIn;
    private Thread thread ;
    private Handler mHandler = new Handler(){

        @Override
        public void dispatchMessage(Message msg) {
            if (wheel != null && player != null ){
                try {
                    wheel.setProgress(player.getCurrentPosition() *1.0f/ player.getDuration());
                } catch (Exception e) {
                    player.release();
                    player = null;
                    e.printStackTrace();
                }
            }
        }
    };

    public MediaPlayerService(Context c,@RawRes int id ) {
        //id为MP3 资源id,这边只是简单的实现功能,需要切换资源的话可以通过setter注入方式改变
        player  = MediaPlayer.create(c, id);
        if (player == null) {
            AssetFileDescriptor fileDesc =c. getResources().openRawResourceFd(id);
            if (fileDesc != null) {
                player = new MediaPlayer();
                try {
                     player.setDataSource(fileDesc.getFileDescriptor(), fileDesc.getStartOffset(), fileDesc.getLength());
                    fileDesc.close();
                } catch (IOException e) {
                   throw  new NullPointerException("ResId " +id +" not found");
                }
                if (player == null) {
                        throw  new NullPointerException("ResId " +id +" not found");
                }
            }
        }


        final AudioManager audioManager = (AudioManager)c. getSystemService(Context.AUDIO_SERVICE);
        if (audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) == 0) {
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)/2 , 0);
        }

        player.setLooping(false);
        try {
            player.prepare();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                wheel.setProgress(1);
                 player.seekTo(0);
                player.pause();
                wheel.setProgress(0);
                imgIn.setImageResource(android.R.drawable.ic_media_play);
            }
        });
        final int milliseconds = 100;
        thread  =   new Thread(){ 
            @Override
            public void run(){
                while(true){ //每隔100毫秒检查状态。
                    try {
                        sleep(milliseconds);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    mHandler.sendEmptyMessage(0);
                }
            }
        };
        thread.start();
    }

    public void setWheel(ProgressWheel wheel) {
        this.wheel = wheel;

    }

    public void playOrPause() {
        if (player == null) return;
        if (player.isPlaying()){
            player.pause();
            imgIn.setImageResource(android.R.drawable.ic_media_play);
        }else {
            imgIn.setImageResource(android.R.drawable.ic_media_pause);
            player.start();
        }
    }


    public void release() {
        player.release();
        player = null;
        thread.interrupt();

    }

    public void stop() {
        if (player.isPlaying()){
            imgIn.setImageResource(android.R.drawable.ic_media_play);
            player.pause();
        }
    }

    public void setParentView(View view) {
        wheel = (ProgressWheel) view.findViewById(R.id.progress_wheel);
        imgIn = (ImageView) view.findViewById(R.id.progress_wheel_src_in);
    }
}

剩下的就是在activity中调用,大致如下:

  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    BaseEntity entity  = (BaseEntity) parent.getAdapter().getItem(position);
                    if (entity.getType() == BaseEntity.Type.TransSep) return;
                    showPopupView(entity,listView);
                }
            });
       private void showPopupView(BaseEntity entity,ListView listView) {

        View view = View.inflate(this,R.layout.pop_view,null);
        service.setParentView(view);
        TextView textView1 = (TextView) view.findViewById(R.id.text1);
        textView1.setText(entity.getContent_ch());
        textView1 = (TextView) view.findViewById(R.id.text2);
        textView1.setText("wdヲ「pqdkくぇd");

        pop.setFocusable(true);
        pop.setContentView(view);
        pop.showAtLocation(listView,Gravity.BOTTOM, 0, 0 );

    }
  public  void  mc_play(View v){
        //frameLayout的点击事件
        service.playOrPause();
    }

以上就实现了简单的播放和进度控制。

© 著作权归作者所有

共有 人打赏支持
Maxium_R
粉丝 2
博文 4
码字总数 1939
作品 0
无锡
程序员
跨平台的农历生日提醒软件--生日小助手

最新版为V3.2 设计理由:Ubuntu11.10下没有合适的农历生日提醒软件。 设计思路:将农历和公历都转化为下一个公历生日,然后排序,判断在某一范围内的生日信息。 描 述:生日小助手是一款基于...

匿名
2012/01/28
1K
0
Linux Deepin系统更新记录(2014-02-20)

今日,Linux Deepin 2013进行了系统更新推送,下面是系统更新解决的部分问题与软件更新情况,供大家参考。 Bug修复 0003037: 深度软件中心“网络应用”分类的“即时通讯”子类,滚动到底部出...

cxbii
2014/02/20
518
6
Twitter 将推出中文版

【搜狐IT消息】北京时间9月13日消息,来自国外媒体的消息,在全球活跃用户突破1亿这一里程碑后,总部位置旧金山的Twitter官方日前宣布 将在未来几周内新增5种语言,分别是印地语、菲律宾语、...

小卒过河
2011/09/13
1K
14
如何设计一个能用google翻译多语言的站点

很多时候,我们需要做一个多语言的站点,cosbeta认为目前多语言网站的解决方案比较多,比如: 做几个不同的分站,通过用户第一次的选择将用户定位到相应语言的分站; 编辑网站内容的时候,添...

芒果龙
2011/11/04
0
0
COBOL 编译器--GnuCOBOL

GnuCOBOL,之前称之为 OpenCOBOL,是 COBOL 编译器。 主要特性: 完全实现 COBOL,无缝集成 C 通过了超过 9700 NIST COBOL 85 测试套件和超过 500 个内部检测 可以直接访问所有 C 库,甚至是...

叶秀兰
2015/10/13
453
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
8分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
42分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部