文档章节

实现日语翻译酱(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
522
6
软件工程专业辅修第二专业学位,向前辈求助~~

本人武汉理工大学软件工程专业大二学生,现可报名辅修武汉地区七所部属高校的第二专业,向前辈们求助,不知应该辅修什么专业?本人辅修的目的是能辅助主修专业,或者说辅修专业可以对将来就业...

Bright_Mon
2012/11/30
760
2
2019-02-14 1992年日本对母语编程的可读性比较实验

这是发现的最早一篇: CiNii 論文 - 母国語プログラミングへの方式,実践とその効果 pdf不能导出文本, 不会日语输入法, 因此论文其他部分意义仅靠猜. 请会日语的指正. 主要看如下几个图, 大概...

吴烜
03/12
0
0
登陆页制作(网页制作)

【项目背景】 我们是一家日本公司,正在运营着一个名为“交通事故病院”的网站。目的是把交通事故的患者介绍到患者所在地附近的整骨院和接骨院。目前已经有上千的合作的整骨院和接骨院了。 ...

zb1494058771839
2017/05/08
10
0

没有更多内容

加载失败,请刷新页面

加载更多

Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部