首页 文章 精选 留言 我的

精选列表

搜索[分片调整],共10000篇文章
优秀的个人博客,低调大师

Android写的一个设置图片查看器,可以调整透明度

先来看看效果吧: main.xml代码如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <LinearLayout 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" > 10 11 <Button 12 android:id="@+id/button1" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:text="增大透明度" /> 16 17 <Button 18 android:id="@+id/button2" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:text="减小透明度" /> 22 23 <Button 24 android:id="@+id/button3" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:text="下一张" /> 28 </LinearLayout> 29 <!-- 定义显示整体图片的ImageView --> 30 31 <ImageView 32 android:id="@+id/imageView1" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:background="#0000ff" 36 android:scaleType="fitCenter" 37 android:src="@drawable/shuangta" /> 38 <!-- 定义显示局部图片的ImageView --> 39 40 <ImageView 41 android:id="@+id/imageView2" 42 android:layout_width="wrap_content" 43 android:layout_height="wrap_content" 44 android:layout_marginTop="10dp" 45 android:background="#0000ff" /> 46 47 </LinearLayout> 其中java代码为: 1 package android.demo; 2 3 import android.app.Activity; 4 import android.graphics.Bitmap; 5 import android.graphics.BitmapFactory; 6 import android.graphics.drawable.BitmapDrawable; 7 import android.os.Bundle; 8 import android.view.MotionEvent; 9 import android.view.View; 10 import android.view.View.OnClickListener; 11 import android.view.View.OnTouchListener; 12 import android.widget.Button; 13 import android.widget.ImageView; 14 15 public class AndroidDemo5Activity extends Activity { 16 // 定义一个访问图片的数组 17 int[] images = new int[] { R.drawable.lijiang, R.drawable.qiao, 18 R.drawable.shuangta, R.drawable.shui, R.drawable.xiangbi, 19 R.drawable.ic_launcher, }; 20 // 定义当前显示的图片 21 int currentImage = 2; 22 // 定义图片的初始透明度 23 private int alpha = 255; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 // TODO Auto-generated method stub 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.main); 30 final Button plusButton = (Button) findViewById(R.id.button1); 31 final Button minuxButton = (Button) findViewById(R.id.button2); 32 final Button nextButton = (Button) findViewById(R.id.button3); 33 34 final ImageView imageview1 = (ImageView) findViewById(R.id.imageView1); 35 final ImageView imageview2 = (ImageView) findViewById(R.id.imageView2); 36 37 // 定义查看下一张图片的时间监听器 38 nextButton.setOnClickListener(new OnClickListener() { 39 40 @Override 41 public void onClick(View v) { 42 if (currentImage >= 5) { 43 currentImage = -1; 44 } 45 BitmapDrawable bitmap = (BitmapDrawable) imageview1 46 .getDrawable(); 47 // 如果图片还没有回收,先强制回收图片 48 if (!bitmap.getBitmap().isRecycled()) { 49 bitmap.getBitmap().recycle(); 50 } 51 // 改变ImageView的图片 52 imageview1.setImageBitmap(BitmapFactory.decodeResource( 53 getResources(), images[++currentImage])); 54 } 55 }); 56 57 // 定义改变图片透明度的方法 58 OnClickListener listener = new OnClickListener() { 59 60 @Override 61 public void onClick(View v) { 62 if (v == plusButton) { 63 alpha += 20; 64 } 65 if (v == minuxButton) { 66 alpha -= 20; 67 } 68 if (alpha > 255) { 69 alpha = 255; 70 } 71 if (alpha <= 0) { 72 alpha = 0; 73 } 74 // 改变图片的透明度 75 imageview1.setAlpha(alpha); 76 77 } 78 }; 79 80 // 为2个按钮添加监听器 81 plusButton.setOnClickListener(listener); 82 minuxButton.setOnClickListener(listener); 83 imageview1.setOnTouchListener(new OnTouchListener() { 84 85 @Override 86 public boolean onTouch(View arg0, MotionEvent arg1) { 87 // TODO Auto-generated method stub 88 BitmapDrawable bitmapDeaw = (BitmapDrawable) imageview1 89 .getDrawable(); 90 // 获取第一个图片显示框中的位图 91 Bitmap bitmap = bitmapDeaw.getBitmap(); 92 double scale = bitmap.getWidth(); 93 // 或许需要显示图片的开始点 94 int x = (int) (arg1.getX() * scale); 95 int y = (int) (arg1.getY() * scale); 96 if (x + 120 > bitmap.getWidth()) { 97 x = bitmap.getWidth() - 120; 98 } 99 if (y + 120 > bitmap.getHeight()) { 100 y = bitmap.getHeight() - 120; 101 } 102 103 // 显示图片的指定区域 104 imageview2.setImageBitmap(Bitmap.createBitmap(bitmap, x, y, 105 120, 120)); 106 imageview2.setAlpha(alpha); 107 return false; 108 } 109 }); 110 } 111 112 } ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/05/17/2506331.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

苹果架构调整:AI、机器学习和Siri合并,由前谷歌AI负责人领导

苹果的AI终于有救了。 因为他们刚刚把所有AI相关部门团队整合到了一起,由4月份离职的谷歌AI一把手负责。 苹果部门整合 这次,苹果整合的是AI和机器学习部门,负责人是刚刚加入苹果的副总裁John Giannandrea。另外,Siri和Core ML两个产品团队也汇报给他。  苹果官方网站上已经更新了领导团队,在CEO Tim Cook和10位高级副总裁/CXO之后,John Giannandrea和苹果其他五位分别负责公关、社会责任、大中华区、广告创意和人力的副总裁并列。  官网信息显示,John Giannandrea的职位机器学习与人工智能策略主管,负责监督整个公司的人工智能和机器学习策略,并且管理Core ML和Siri的技术开发,目前是直接汇报给Tim Cook的16位高管之一。  此前,苹果AI研究院的负责人是卡内基梅隆大

优秀的个人博客,低调大师

Android弹幕实现:基于B站弹幕开源系统(3)-文本弹幕的完善和细节调整

 Android弹幕实现:基于B站弹幕开源系统(3) 本文在附录1,2的基础上再次对异步获取弹幕并显示弹幕完善逻辑和代码,集中在上层Java代码部分: package zhangphil.danmaku; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.View; import android.widget.Button; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.DanmakuTimer; import master.flame.danmaku.danmaku.model.IDisplayer; import master.flame.danmaku.danmaku.model.android.DanmakuContext; import master.flame.danmaku.ui.widget.DanmakuView; public class MainActivity extends Activity { private DanmakuView mDanmakuView; private DanmakuContext mContext; private AcFunDanmakuParser mParser; private final int MAX_DANMAKU_LINES = 8; //弹幕在屏幕显示的最大行数 private ScheduledThreadPoolExecutor mScheduledThreadPoolExecutor = null; private ConcurrentLinkedQueue<DanmakuMsg> mQueue = null; //所有的弹幕数据存取队列,在这里做线程的弹幕取和存 private ArrayList<DanmakuMsg> danmakuLists = null;//每次请求最新的弹幕数据后缓存list private final int WHAT_GET_LIST_DATA = 0xffa01; private final int WHAT_DISPLAY_SINGLE_DANMAKU = 0xffa02; private final int BASE_TIME = 400; private final int BASE_TIME_ADD = 100; //标志文本弹幕的序列号 //区别不同弹幕 private static int danmakuTextMsgId = 0; private final int[] colors = {Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN, Color.CYAN, Color.DKGRAY}; private Handler mDanmakuHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case WHAT_GET_LIST_DATA: mDanmakuHandler.removeMessages(WHAT_GET_LIST_DATA); if (danmakuLists != null && !danmakuLists.isEmpty()) { mQueue.addAll(danmakuLists); danmakuLists.clear(); if (!mQueue.isEmpty()) mDanmakuHandler.sendEmptyMessage(WHAT_DISPLAY_SINGLE_DANMAKU); } break; case WHAT_DISPLAY_SINGLE_DANMAKU: mDanmakuHandler.removeMessages(WHAT_DISPLAY_SINGLE_DANMAKU); displayDanmaku(); break; } } }; /** * 弹幕数据封装的类(bean) */ private class DanmakuMsg { public String msg; } private void displayDanmaku() { boolean p = mDanmakuView.isPaused(); //如果当前的弹幕由于Android生命周期的原因进入暂停状态,那么不应该不停的消耗弹幕数据 //要知道,在这里发出一个handler消息,那么将会消费(删掉)ConcurrentLinkedQueue头部的数据 if (!mQueue.isEmpty() && !p) { DanmakuMsg dm = mQueue.poll(); if (!TextUtils.isEmpty(dm.msg)) { addDanmaku(dm.msg, true); } mDanmakuHandler.sendEmptyMessageDelayed(WHAT_DISPLAY_SINGLE_DANMAKU, (long) (Math.random() * BASE_TIME) + BASE_TIME_ADD); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); danmakuLists = new ArrayList<>(); mQueue = new ConcurrentLinkedQueue<>(); mDanmakuView = (DanmakuView) findViewById(R.id.danmakuView); initDanmaku(); mScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1); GetDanmakuMessageTask mTask = new GetDanmakuMessageTask(); //延迟0秒执行,每隔若干秒周期执行一次任务 mScheduledThreadPoolExecutor.scheduleAtFixedRate(mTask, 0, 5, TimeUnit.SECONDS); Button show = (Button) findViewById(R.id.show); Button hide = (Button) findViewById(R.id.hide); Button sendText = (Button) findViewById(R.id.sendText); Button pause = (Button) findViewById(R.id.pause); Button resume = (Button) findViewById(R.id.resume); Button clear = (Button) findViewById(R.id.clear); show.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDanmakuView.show(); } }); hide.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDanmakuView.hide(); } }); sendText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //每点击一次按钮发送一条弹幕 sendTextMessage(); } }); pause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDanmakuView.pause(); } }); resume.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDanmakuView.resume(); } }); clear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clearDanmaku(); } }); } /** * 假设该线程任务模拟的就是从网络中取弹幕数据的耗时操作 * 假设这些弹幕数据序列是有序的。 */ private class GetDanmakuMessageTask implements Runnable { @Override public void run() { danmakuLists.clear(); int count = (int) (Math.random() * 50); for (int i = 0; i < count; i++) { DanmakuMsg message = new DanmakuMsg(); message.msg = "弹幕:" + danmakuTextMsgId; danmakuLists.add(message); danmakuTextMsgId++; } if (!danmakuLists.isEmpty()) { Message msg = mDanmakuHandler.obtainMessage(); msg.what = WHAT_GET_LIST_DATA; mDanmakuHandler.sendMessage(msg); } } } /** * 驱动弹幕显示机制重新运作起来 */ private void resumeDanmaku() { if (!mQueue.isEmpty()) mDanmakuHandler.sendEmptyMessageDelayed(WHAT_DISPLAY_SINGLE_DANMAKU, (int) (Math.random() * BASE_TIME) + BASE_TIME_ADD); } private void clearDanmaku() { if (danmakuLists != null && !danmakuLists.isEmpty()) { danmakuLists.clear(); } if (mQueue != null && !mQueue.isEmpty()) mQueue.clear(); mDanmakuView.clearDanmakusOnScreen(); mDanmakuView.clear(); } private void initDanmaku() { mContext = DanmakuContext.create(); // 设置最大显示行数 HashMap<Integer, Integer> maxLinesPair = new HashMap<>(); maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, MAX_DANMAKU_LINES); // 滚动弹幕最大显示5行 // 设置是否禁止重叠 HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<>(); overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true); overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true); //普通文本弹幕也描边设置样式 //如果是图文混合编排编排,最后不要描边 mContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 10) //描边的厚度 .setDuplicateMergingEnabled(false) .setScrollSpeedFactor(1.2f) //弹幕的速度。注意!此值越小,速度越快!值越大,速度越慢。// by phil .setScaleTextSize(1.2f) //缩放的值 // .setCacheStuffer(new BackgroundCacheStuffer()) // 绘制背景使用BackgroundCacheStuffer .setMaximumLines(maxLinesPair) .preventOverlapping(overlappingEnablePair); mParser = new AcFunDanmakuParser(); mDanmakuView.prepare(mParser, mContext); //mDanmakuView.showFPS(true); mDanmakuView.enableDanmakuDrawingCache(true); if (mDanmakuView != null) { mDanmakuView.setCallback(new master.flame.danmaku.controller.DrawHandler.Callback() { @Override public void updateTimer(DanmakuTimer timer) { } @Override public void drawingFinished() { } @Override public void danmakuShown(BaseDanmaku danmaku) { //Log.d("弹幕文本", "danmakuShown text=" + danmaku.text); } @Override public void prepared() { mDanmakuView.start(); } }); } } private void sendTextMessage() { addDanmaku("zhangphil@csdn: " + System.currentTimeMillis(), true); } private void addDanmaku(CharSequence cs, boolean islive) { BaseDanmaku danmaku = mContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); if (danmaku == null || mDanmakuView == null) { return; } danmaku.text = cs; danmaku.padding = 5; danmaku.priority = 0; // 可能会被各种过滤器过滤并隐藏显示 danmaku.isLive = islive; danmaku.setTime(mDanmakuView.getCurrentTime() + 1200); danmaku.textSize = 20f * (mParser.getDisplayer().getDensity() - 0.6f); //文本弹幕字体大小 danmaku.textColor = getRandomColor(); //文本的颜色 danmaku.textShadowColor = getRandomColor(); //文本弹幕描边的颜色 //danmaku.underlineColor = Color.DKGRAY; //文本弹幕下划线的颜色 danmaku.borderColor = getRandomColor(); //边框的颜色 mDanmakuView.addDanmaku(danmaku); } @Override protected void onPause() { super.onPause(); if (mDanmakuView != null && mDanmakuView.isPrepared()) { mDanmakuView.pause(); } } @Override protected void onResume() { super.onResume(); if (mDanmakuView != null && mDanmakuView.isPrepared() && mDanmakuView.isPaused()) { mDanmakuView.resume(); //重新启动handler消息机制,触发弹幕显示 //如果没有这一个方法,那么显示弹幕的机制将失灵(失去驱动) //这个方法就是重新激发弹幕显示的handler机制。 resumeDanmaku(); } } private void closeGetDanmakuMessage() { if (mScheduledThreadPoolExecutor != null) mScheduledThreadPoolExecutor.shutdown(); } @Override protected void onDestroy() { super.onDestroy(); if (mDanmakuView != null) { // dont forget release! mDanmakuView.release(); mDanmakuView = null; } closeGetDanmakuMessage(); } /** * 从一系列颜色中随机选择一种颜色 * * @return */ private int getRandomColor() { int i = ((int) (Math.random() * 10)) % colors.length; return colors[i]; } } 代码运行结果如图: 附录:1,《Android弹幕实现:基于B站弹幕开源系统(1)》链接:http://blog.csdn.net/zhangphil/article/details/68067100 2,《Android弹幕实现:基于B站弹幕开源系统(2)》链接:http://blog.csdn.net/zhangphil/article/details/68114226 3,《Java ConcurrentLinkedQueue队列线程安全操作》链接:http://blog.csdn.net/zhangphil/article/details/65936066

优秀的个人博客,低调大师

BTA | 周政军:区块链中侧链和分片解决不了的扩容问题,交给DAG吧!

TrustNote创始人周政军开篇就用梅特卡夫定律、马太效应分析互联网生态的价值,类比区块链生态,并以互联网生态的价值公式V=K*P*(N2/R2)评估区块链生态价值。 在周政军看来,从互联网的出现、发展到BAT的出现,互联网的价值除了和节点的平方成正比以外,还和节点相互之间相互建立的连接成反比。在方程中,N代表网络里的用户数,这个网络是个概括性的网络,可能是物联网,也可能是社交网络;R代表两个用户之间建立的连接成本; P代表市场份额;K代表每个节点的变现能力。对于区块链应用,要在今天的网络里输出价值,给社会带来真正的贡献,必须回顾这个公式。 除此,周政军还高屋建瓴地谈到了为什么要用扩容,为什么要选择DAG,钱包的建设应该注意哪些问题,智能合约在设计中又应考虑到哪些问题。洋洋洒洒近万字的分享,却逻辑清楚,层次分明,对于技术人员来说,是

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册