文档章节

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

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

Bright_Mon
2012/11/30
712
2
登陆页制作(网页制作)

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

zb1494058771839
2017/05/08
0
0
日语技术文档翻译

有一份对油压机的日语技术文档需要翻译,5000字左右。

蝈蝈吃果果
2017/05/17
1
0

没有更多内容

加载失败,请刷新页面

加载更多

如何利用 Data too long for column 进行一些简单的攻击

1: 前提条件, 后台没有校验长度和频率校验,也没有CSRF校验,直接往数据库插入数据,此时很容易触发Data too long for column错误(一般抛出异常都挺浪费资源的,耗时,耗内存,耗cpu),一旦...

专业写BUG的程序员
23分钟前
3
0
RMAN命令详解

一、list命令 1. List 当前RMAN所备份的数据库: 1.1. list backup summary; --概述可用的备份 list incarnation;--汇总查询 --如果备份文件多的话多用这两个list命令可以对备份文件有个总体...

突突突酱
27分钟前
1
0
简单聊聊Linux学习经历

学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为...

问题终结者
34分钟前
1
0
Mysql高级 (2)——sql性能调优

sql 性能下降的原因 sql service的解析顺序 sql 的7中join

小小小施爷
39分钟前
1
0
MaxCompute用户初体验

作为一名初次使用MaxCompute的用户,我体会颇深。MaxCompute 开箱即用,拥有集成化的操作界面,你不必关心集群搭建、配置和运维工作。仅需简单的点击鼠标,几步操作,就可以在MaxCompute中上...

阿里云官方博客
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部